算法設計:
本題不能用遞歸來計算,通過輸出結果可知道f(n)是一個循環,所以只需要求出其一個循環存入數組且設有k個元素,對于每一個輸入n,在數組中第n%k個元素,即是f(n)的值.
程序設計:
int fun(int a,int b,int n)函數返回f(n)的值,fn[50]數組中存放一個循環的相應f(n)的值且fn[1]=fn[2]=1.從k=3開始循環fn[k] = (a * fn[k-1] + b * fn[k-2]) % 7直到有(fn[k]==1&&fn[k-1]==1)則停止,將k回退到(k-2)作為循環個數.將fn[0]=fn[k],返回值fn[n%k]即為所求的f(n).
import java.util.Scanner;
public class hd1005 {
/**
* @param args
*/
public static int fun(int a,int b,int n){
//int fn1=1,fn2=1,k=3;
int k=3;
int fn[]=new int[50];
fn[1]=fn[2]=1;
while (k<=49) {
fn[k] = (a * fn[k-1] + b * fn[k-2]) % 7;
if(fn[k]==1&&fn[k-1]==1){
k=k-2;
break;
}
k++;
}
/*for(int i=1;i<=k;i++){
System.out.println(i+":"+fn[i]);
}*/
fn[0]=fn[k];
return fn[n%k];
}
public static void main(String[] args) {
// TODO 自動生成方法存根
int a,b,n;
Scanner s = new Scanner(System.in);
while(s.hasNext()){
a=s.nextInt();
b=s.nextInt();
n=s.nextInt();
if(a==0&&b==0&&n==0)
break;
System.out.println(fun(a,b,n));
}
s.close();
}
}