您的位置:首页 > 其它

ZOJ 1962 How Many Fibs?

2013-07-06 21:12 344 查看
ZOJ 1962 How Many Fibs?
      这道题从下午开始写真的是一停不停的写到了晚上,一开始没用函数,就字符收进两个字符串,每收一组就把所有fibs计算一遍,哼哼!果断超时了。

      然后老师特意讲了二位数组的指针思想,然后又给了一个用C写的例子,哈哈,看着这个例子处理方法和我一样,可是用了函数就好太多。

      题意:关于大数。给出两个大数,计算这两个大数的闭区间中有几个斐波那契数。关于斐波那契数,也是大数问题,可以先去做ZOJ 1828,感谢钟老师。

      细节+代码如下:

     

#include<stdio.h>
#include<string.h>
char a[500]; /*注意它是全局的。*/
void add(char *c,char *b){
int k,sum[600],mark,old[600],newe[600],mc,mb;
char t;
memset(old,0,sizeof(old)); /*第一次用这个函数,其实我还尝试用它来初始化字符串,*/
memset(newe,0,sizeof(newe)); /*只要写成'0',竟然可以!百度上中间变量写的整型。*/
mc = strlen(c)-1;
mb = strlen(b)-1;
for(k = 0;k<=mc/2;k++){ /*反转呐。*/
t = c[k];        /*有人曾问我为什么那么依赖Debug,想想真的想哭。*/
c[k] = c[mc-k];
c[mc-k] = t;
}
for(k = 0;k<=mb/2;k++){
t = b[k];
b[k] = b[mb-k];
b[mb-k] = t;
}
for(k = 0;k<=mc;k++)
old[k] = c[k]-'0';
for(k = 0;k<=mb;k++)
newe[k] = b[k]-'0';
for(k = 0;k<=500;k++)
sum[k] = old[k]+newe[k];
for(k = 0;k<=500;k++){
if(sum[k]>=10){
sum[k+1] = sum[k+1]+sum[k]/10;
sum[k] = sum[k]%10;
}
}
for(k = 500;k>=0;k--){
if(sum[k]!=0){
mark = k;
break;
}
}
for(k = 0;k<=mark;k++)
a[k] = sum[mark-k]+'0';
a[mark+1] = '\0';
for(k = 0;k<=mc/2;k++){ /*用完再反转过来,不然这个函数用的指针,*/
t = c[k];           /*操作对变量的处理结果不会消亡。*/
c[k] = c[mc-k];
c[mc-k] = t;
}
for(k = 0;k<=mb/2;k++){
t = b[k];
b[k] = b[mb-k];
b[mb-k] = t;
}
}
int cmp(char *a,char *b){
int ma,mb;
ma = strlen(a)-1;
mb = strlen(b)-1;
if(ma<mb) /*明明比较的方法一样,为什么别人就能写的这么齐整?*/
return -1;
else if(ma>mb)
return 1;
else
return strcmp(a,b);
}
int main(){
int i,n;
char small[600],large[600],fb[600][600];
strcpy(fb[1],"1"); /*双引号,它表示的是字符串呀。函数用得好~!*/
strcpy(fb[2],"2");
for(i = 3;i<=500;i++){
add(fb[i-2],fb[i-1]);
strcpy(fb[i],a);
}
while(scanf("%s%s",small,large)!=EOF){
n = 0;
if(strcmp(small,"0")==0&&strcmp(large,"0")==0) /*函数用得好!*/
break;
for(i = 1;i<=500;i++){
if(cmp(small,fb[i])<=0&&cmp(large,fb[i])>=0)
n++;
if(cmp(large,fb[i])<=0)
break;
}
printf("%d\n",n);
}
return 0;
}


 

     
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: