首页 > 代码库 > HDU 4814

HDU 4814

题目的大意就是用(1+√5)/2进制来表示十进制中的数。

做法就是一个模拟,a[]数组表示答案,其中第50位表示个位,后面的是小数位。
利用题目给的两个公式,进行一系列进位等操作。

#include <iostream>#include <cstdio>#include <cstring>using namespace std;#define maxn 110int 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;    }}

  但是奇怪的是,当我调换了循环的顺序,从前向后循环就会出现一个错误的结果,很是不解。

HDU 4814