新的斐波那契數列

轉載請標明出處:牟尼的專欄 http://blog.csdn.net/u012027907

Problem1: 

題目描述: 

定義一個新的斐波那契數列:

 F(0)=7; 

F(1)=11; 

F(n)=F(n-1)+F(n-2);(n>=2) 

輸入: 

輸入有多組;首先輸入一個N(N<=100),代表要輸入的測試用例的個數;接下來輸入N個數字ni(ni<=100),數字間用空格隔開。

輸出: 

求F(n)能否被3整除,若能整除輸出‘yes’,否則輸出‘no’。 

樣例輸入:

 3 0 1 2 

樣例輸出:

no 

no

yes

提示:不能用遞歸,否則超時!在計算時,我們沒必要算出遞推的真正值,後面會越來越大,可能Int 都存不下了!題目只要求算是否是3的倍數,也就是說,不管值多大,最後都只是 3n+0,3n+1,3n+2 這三種情況,我們只需對3取餘即可。

/*
 * 描述: 新的斐波那契數列
 * 作者: 張亞超 
 * 博客: 牟尼的專欄 http://blog.csdn.net/u012027907
 * 日期: 2014/8/24
 */
#include<stdio.h>
#define N 105

int F[N]; // 記錄遞推數對3取餘的餘數
int I[N]; // 記錄輸入的n個值
bool mark[N]; //標記對應數是否是3的餘數

int main(){

	F[0] = 7;
	F[1] = 11;
	for(int i = 0; i < N; i++) //標記初始化爲false
		mark[i] = false;

	for(i = 2; i < N; i++){    //計算遞推數對3取餘的餘數
		F[i] = F[i-1] + F[i-2];
		if(F[i] % 3 == 0)     //若爲3的倍數,標記
			mark[i] = true;		
		F[i] %= 3;            //重要一步,簡化運算,只存對3的餘數
	}


	int n;
	while(scanf("%d",&n) != EOF){
		for(int i = 0; i < n; i++){  //輸入
			scanf("%d",&I[i]);
		}
		for( i = 0; i < n; i++){     //輸出
			if(mark[I[i]])
				printf("yes\n");
			else
				printf("no\n");
		}
	}
	return 0;
}
轉載請標明出處:牟尼的專欄 http://blog.csdn.net/u012027907

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章