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;
    }
}

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

posted @ 2014-09-24 15:50  ouc_ye  阅读(213)  评论(0编辑  收藏  举报