题目是让你用递推来写,那个f1,f2,fn不是说表示数组,而是告诉你怎样将复杂问题变为简单式子。
递推就把复杂问题分解成重复的单运算,再通过循环累积计算。
这里fn就是前两个数的和,比如f3就是f1,f2的和,f4就是f2,f3的和,所以要得到f4(也就是n=4),只要先计算f1+f2,再拿这个和加上f2(上一次运算式子中最大数)。
另外,题目要求在循环递推时直接取余。(先求和再取余等同于分别取余再求和)。
下面我写的代码(考虑数值范围,我用长整型变量)。
#include
typedef long long LLG;
LLG fun(LLG n);
int main(void)
{
LLG n=0;
while(1)
{
while(n<1 || n>1000000)
printf("Input: "),scanf("%I64d",&n);
printf("Output: %I64d\n\n",fun(n));
n=0;
}
return 0;
}
LLG fun(LLG n)
{
LLG i,f1=1,f2=1,f;
if(n==1 || n==2) return 1;
for(i=3;i<=n;i++)
{
f=f1%10007+f2%10007;
f1=f2,f2=f;
}
return f;
}
要在过程中就用%10007取余,否则第四十多项时就会溢出。
你的算法也与题目要求有出入。
#include "stdio.h"
int main(int argc,char *argv[]){
int a,b,n,i,t;
printf("Enter n(int 0 if(scanf("%d",&n)!=1 || n<1 || n>1000000){ printf("Input error, exit...\n"); return 0; } if(a=b=1,n>2) for(i=3;i<=n;i++){ t=b%10007; b=(t+a%10007)%10007; a=t; } printf("%d\n",b); return 0; } 若帮助了你,请采纳。
首先你写的是C语言,但是好像选成了c++,题目没有要你打印“请输入整数”,你就不要打印这句
你的Fn只有10007项,而题目要求可能到100万项
直接算数太大了,题目提示了,应该每次取余数,(x+y)%n=(x%n+y%n)%n
#include
int main()
{
int n,r;
scanf("%d",&n);
if(n==1||n==2) {putchar('1');return 0;}
for( int i=1,j=1,c=3;c<=n;c++)
{
r=(i+j)%10007;
i=j;
j=r;
}
printf("%d",r);
return 0;
}
斐波那契算到最后很大的,你这样用不了几项就溢出来,一百项都装不下
结果当然不对了
最简单的改法,每个计算的同时就取余
另外,仔细看题,n的规模是一百万