标签:for 比较 while 问题 需要 return 多少 ges .com
特点:头两项均为1,后面任一项都是其前两项之和。
程序在计算中需要用两个变量存储最近产生的两个序列值,且产生了新数据后,两个变量要更新。
int i,x1,x2,x; x1=1; //头两项都是1 x2=1; printf("%6d%6d",x1,x2); for(i=1;i<=8;i++){ //循环输出后8项 x=x1+x2; //计算新项 printf("%6d",x); x1=x2; //更新x1和x2,为下一次计算新项x作准备 x2=x; } printf("\n"); return 0;
int i; int fib[10]={1,1}; //数组初始化,生成斐波那契数列前两个数 for(i=2;i<10;i++) fib[i]=fib[i-1]+fib[i-2]; for(i=2;i<10;i++){ printf("%6d",fib[i]); if((i+1)%5 == 0) //每输出5个数就换行 printf("\n"); } return 0;
Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1。
当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少。
说明:在本题中,答案是要求Fn除以10007的余数,因此我们只要能算出这个余数即可,而不需要先计算出Fn的准确值,再将计算的结果除以10007取余数,直接计算余数往往比先算出原数再取余简单。
#include <stdio.h> int main( void ) { // f(-1)=1, f(0)=0, f(1)=1; f(n)=[f(n-1)+f(n-1)]%10007 unsigned cycle = 1; for( unsigned a=0,b=1; !(a==1&&b==0); ++cycle ) { unsigned c = (a+b)%10007; a = b; b = c; } printf( "cycle = %u\n", cycle ); // 20016 return 0; }
输出结果为20016。
此时我们知道,当n=20016时,输出值为0;n=20017时,输出值为1...
所以我们可以写出以下代码:
#include <stdio.h> int main( void ) { unsigned n; scanf( "%u", &n ); n %= 20016; unsigned a=1, b=0; while( n-- ) { unsigned c = (a+b)%10007; a = b; b = c; } printf( "%u", b ); return 0; }
标签:for 比较 while 问题 需要 return 多少 ges .com
原文地址:http://www.cnblogs.com/OctoptusLian/p/6380452.html