【发布时间】:2013-09-23 16:21:50
【问题描述】:
对于 2008 年 google codejam 中的 problem statement:第 1A 轮问题 3
在这个问题中,你必须找到最后三位数字 数字的小数点 (3 + √5)n.
例如,当 n = 5 时,(3 + √5)5 = 3935.73982... 答案是 935。
对于 n = 2,(3 + √5)2 = 27.4164079...答案是 027。
我的解决方案基于 T(i) = 6*T(i-1) - 4*T(n-2) + 1,其中 T(i) 是 n=i 的整数部分为下面:
#include<stdio.h>
int a[5000];
main(){
unsigned long l,n;
int i,t;
a[0]=1;
a[1]=5;
freopen("C-small-practice.in","r",stdin);
scanf("%d",&t);
for(i=2;i<5000;i++)
a[i]=(6*a[i-1]-4*a[i-2]+10001)%1000;
i=t;
for(i=1;i<=t;i++){
scanf("%ld",&n);
printf("Case #%d: %.3d\n",i,a[(int)n]);
}
fclose(stdin);
}
在a[i]=(6*a[i-1]-4*a[i-2]+10001)%1000; 行中我知道会有整数溢出,但我不知道为什么加上 10,000 我得到了正确的答案。
我正在使用 GCC 编译器,其中 sizeof(int)=4
谁能解释发生了什么?
【问题讨论】:
标签: algorithm integer-overflow