算法设计:
本题不能用递归来计算,通过输出结果可知道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();
}
}
posted on 2008-06-06 11:31
poower 阅读(3841)
评论(0) 编辑 收藏