轉載請標明出處:牟尼的專欄 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