回 帖 发 新 帖 刷新版面

主题:第44次编程比赛第一题~~

已知一个数有如下递推关系~~~

[b][size=5]F[/size][/b][b][size=3]i[/size][/b][b][size=5] = [/size][/b][b][size=5]2[/size][/b][b][size=5]F[/size][/b][b][size=3]i-1[/size][/b][b][size=5] + [/size][/b][b][size=5]F[/size][/b][b][size=3]i-2[/size][/b]

设F1=1,F2=3,则有F3 = 2 x F2 + F1 = 7,F4 = 2 x F3 + F2 = 17

    已经证明,由该数可以用来做一个数字系统的基,在此系统下,任一正整数都可以只用数字0,1,2来表示。

如:230 = 2 x F6 + 0 x F5 + 1 x F4 + 2 x F3 + 0 x F2 + 1 x F1 
    = 2 x 99 + 0 x 41 + 1 x 17 + 2 x 7 + 0 x 3 + 1 x 1
    =(201201)F

168 = F6 + F5 + F4 + F3 + F2 + F1 
    = 99 + 41 + 17 + 7 + 3 + 1 
    =(111111)F

[color=FF0000]补充:如果出现一个2,则后面必须出现一个0,比如hotzenplotz提到的7可以用100也可以用21,根据这一规则,则7应该用100~~~[/color]


请编写一包含main的完整程序,并根据运行时所带的参数,输出该参数基于上面的数字系统后以0,1,2来表示的结果

如程序被编译为44.exe,则44.exe 168,此时输出111111,运行时参数所表示的数字大小不会超过(unsigned long long)的表示范围。

测试环境为gcc3.4.2
截止时间:下个星期一(10月16日)中午12点

有任何问题,请发帖讨论,或直接通过论坛发短消息给我~~

祝大家好运~~


回复列表 (共22个回复)

21 楼

苍天啊。。。
----------------------------------------------------------------
#include <iostream.h>

unsigned long long f[60];
unsigned int asn[31];
unsigned long long dat;

void fn(unsigned int n)
{
    if(n>=3)
        f[n]=f[n-1]*2+f[n-2];
}

unsigned int com(void)
{
    unsigned int len;
    int temp;
    int i;

    for(i=0;;)
    {
        fn(i);
        f[0]=f[0]+f[i];
        temp=(f[0]-dat);
        if(temp>=0)
        {
            f[0]=f[0]-f[i];
            break;
        }
        asn[i]=asn[i]+1;
        i++;
    }
    i--;
    len=i;
    for(;f[0]-dat!=0;)
    {
        f[0]=f[0]+f[i];
        temp=f[0]-dat;
        if(temp>0)
        {
            f[0]=f[0]-f[i];
            i--;
            continue;
        }
        asn[i]=asn[i]+1;
    }
    return len;
}

void res(unsigned int len)
{
    int i;
    int th;
    int tl;

    for(i=len;i>=2;i--)
    {
        th=asn[i];
        tl=asn[i-1];
        if((th-2>=0)&&(tl-1>=0))
        {
            asn[i]=asn[i]-2;
            asn[i-1]=asn[i-1]-1;
            asn[i+1]=asn[i+1]+1;
        }
    }
    if(asn[1]>=3)
    {    asn[1]=asn[1]-3;
        asn[2]=asn[2]+1;
    }
    if(asn[len+1]!=0)
        len++;
    for(i=len;i>=1;i--)
        cout<<asn[i];
}

int main()
{
    f[0]=0;
    f[1]=1;
    f[2]=3;

    cin>>dat;

    if(dat<=1)
    {    if(dat==1)    cout<<"1"<<endl;
        if(dat==0)      cout<<"0"<<endl;
    }
    else
    {    res(com());
    }

    return 0;
}

22 楼

比赛时间到~~

我来回复

您尚未登录,请登录后再回复。点此登录或注册