link:http://poj.org/problem?id=2413

这题没什么难度,就是稍微繁琐一点罢了,题意就是给出两个数的范围,问在这

范围内的Fibonacci num有多少个,只是数据有点大,但是用大数可以解决。。

写这题的原因是因为在做的过程中一直有个地方不对,通过调试才知道strcmp的用法一直

没有搞清楚。。strcmp的比较原理是从首位开始比较,谁先大那么那个数就大,我一直认为的

是先比较字符串的长度,长度不同时长度长的大,长度相同的情况下再比较每位的大小。。原来是不比较长度的!!!

比如strcmp(“10″,”2″)应该为-1。。算是巩固了一下

下面是我的代码,写的比较烂。。

code:

#include <stdio.h>
#include <string.h>
char a[500][110];
void add(char b[],char c[],char d[])
{
    int i,j,k=0,up=0;
    int x,y,z,t;
    i=strlen(b)-1,j=strlen(c)-1;
    while(i>=0||j>=0)
    {
        if(i<0) x=0;else x=b[i]-‘0’;
        if(j<0) y=0;else y=c[j]-‘0′;
        z=x+y+up;
        if(z>9)
        {
            up=1;
            z-=10;
        }
        else
            up=0;
        d[k++]=z+’0′;
        i–,j–;
    }
    if(up)
        d[k++]=’1’;
    d[k]=”;
    for(i=0;i<k/2;i++)
    {
        t=d[i];
        d[i]=d[k-i-1];
        d[k-i-1]=t;
    }
}
void init()
{
    int i;
    strcpy(a[1],”1″);
    strcpy(a[2],”2″);
    for(i=3;i<500;i++)
        add(a[i-2],a[i-1],a[i]);
}
int compose(char b[],char c[])
{
 if(strcmp(b,c)==0)
  return 2;
 if(strlen(b)<strlen(c)||strlen(b)==strlen(c)&&strcmp(b,c)<0)
  return 0;
 return 1;
}
int main()
{
    init();
    char b[110],c[110];
    int cnt,i;
    while(scanf(“%s%s”,b,c)!=EOF)
    {
        cnt=0;
        if(!strcmp(b,”0″)&&!strcmp(c,”0″))
            break;
        for(i=1;i<500;i++)
  {
            if(compose(a[i],b))
                break;
  }
        for(i=i;i<500;i++)
        {
            if(compose(a[i],c))
   {
    if(compose(a[i],c)==2)
     cnt++;
                break;
   }
   cnt++;
        }
        printf(“%d\n”,cnt);
    }
    return 0;
}

发表评论

电子邮件地址不会被公开。

Post Navigation