HDU 4814
题目的大意就是用(1+√5)/2进制来表示十进制中的数。
做法就是一个模拟,a[]数组表示答案,其中第50位表示个位,后面的是小数位。
利用题目给的两个公式,进行一系列进位等操作。
#include <iostream> #include <cstdio> #include <cstring> using namespace std; #define maxn 110 int a[maxn]; int main() { //freopen("out(2).txt", "w", stdout); int n; while(scanf("%d", &n) != EOF) { if(n == 1) { printf("1\n"); continue; } memset(a, 0, sizeof(a)); a[50] = n; int f = 1; while(f) { f = 0; for(int i = 100; i >= 0; i--) { if(a[i] > 1) { f = 1; int t = a[i] / 2; a[i] -= t * 2; a[i-1] += t; a[i+2] += t; } } for(int i = 100; i >= 0; i--) { if(a[i+1] && a[i+2]) { f = 1; int t = min(a[i+1], a[i+2]); a[i+1] -= t; a[i+2] -= t; a[i] += t; } } } f = 0; int f1 = 0; for(int i = 0; i <= 50; i++) { if(a[i] == 0) { if(f) printf("0"); } else { printf("1"); f = 1; } } if(f == 0) printf("0"); f = 0; for(int i = 51; i < 100; i++) { if(a[i] == 0) f++; else { if(!f1) { f1 =1; printf("."); } for(int j = 0; j < f; j++) printf("0"); printf("1"); f = 0; } } cout << endl; } }
但是奇怪的是,当我调换了循环的顺序,从前向后循环就会出现一个错误的结果,很是不解。