随笔 - 11  文章 - 2  trackbacks - 0
<2024年12月>
24252627282930
1234567
891011121314
15161718192021
22232425262728
2930311234

常用链接

留言簿

随笔分类

随笔档案

文章分类

文章档案

新闻分类

link

搜索

  •  

最新评论

阅读排行榜

评论排行榜

算法设计:

本题不能用递归来计算,通过输出结果可知道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)  编辑  收藏

只有注册用户登录后才能发表评论。


网站导航: