总结:

找循环节点,

使用一个二维数组visited[i][j]来存放前两个数为i,j时的这个数出现的位置。

算出周期,再用一定的公式就可以解出。

 

代码如下:

#include<stdio.h>
int main()
{
 int a,b,n,f1,f2,f3,i,j,t,num;
 while(scanf("%d %d %d",&a,&b,&n),a||b||n)
 {
  f1=1;f2=1;int visited[8][8]={0};int flag=0;
  f3=1;
  for(i=3;i<=n;i++)
  {
   if(visited[f1][f2])
   {
    t=i-visited[f1][f2];
    num=(n-visited[f1][f2])%t+visited[f1][f2];
    for(i=0;i<8;i++)
    {
     for(j=0;j<8;j++)
     {
      if(visited[i][j]==num)
      { flag=1;
      break;}
     }
     if(flag==1)
      break;
     
    }
    f3=(a*j+b*i)%7;break;
   }
   else
   {
    f3=(a*f2+b*f1)%7;
    visited[f1][f2]=i;
    f1=f2;f2=f3;
   }
  }
  printf("%d\n",f3);
 }
 return 0;
}

 

很郁闷,做这道题目做了一个下午,主要还是自己太粗心。

首先,在周期和根据周期算对应第一个周期里的位置时,错了,

其次,在循环的初值安排上错了,将0写成了1

再次,在退出二重循环的时候错了,我用了已经增值了j的visited[i][j]再次进行判断,后来改成用flag标记

。。。。。。。所以做题目一定要细心啊,错了一个地方就要浪费掉很多时间(我找了相当多的测试数据才发现错误)。。。。

posted on 2008-10-24 17:26  pandy  阅读(527)  评论(0编辑  收藏  举报