数字河

来源:互联网 发布:ps盖印图层快捷键 mac 编辑:程序博客网 时间:2024/04/29 00:27

时限:1000ms 内存限制:10000K 总时限:3000ms

描述:

数字河中的一个数n 的后继数是n 加上其每位数字的和。例如,12345的后继数是12360,因为12345+1+2+3+4+5=12360。如果数字河的第一个数为k,我们就称此数字河为river k。例如,river 480 代表序列{480, 492, 507, 519, ...},river 483 代表序列{483, 498, 519, ...}。
当两个数字河有相同的元素时,我们称这两个数字河在此元素处相遇。例如,river 480 和river 483 在元素519处相遇。所有数字河都会和river 1, river 3 或river 9 相遇。编程计算给定的数字河最先与以上三条河流中的哪一条相遇,在何元素处相遇?

输入:

输入文件包括多组测试用例,每个测试用例占一行,以“0”标志文件结束,该行无需处理。
每行给定一个整数 n ,(1<=n<=16384) ,即river n。

输出:

对于每个测试用例输出两行,第一行为测试用例号,第二行输出“first meets river x at y”。其中,y表示river n 最先遇到的river x中的最小元素值(x = 1,3,9)。

输入样例:

117520

#include<iostream>using namespace std;int main(){     int a[1000],b[1000],c[1000],num[50];//定义数组储存river 1,river 3,river 9,和输入测试的数字     a[0]=1;b[0]=3,c[0]=9;    int i,j,k; int sum=0; int flag; for(i=0;i<50;i++)//输入测试数字  {  cin>>num[i];  if(num[i]==0)  {   break;  }  sum+=1; } for(i=1;i<1000;i++) {       int temp;     //计算river 1     temp=a[i-1];    a[i]=a[i-1];  while(temp/10!=0)  {    a[i]=a[i]+temp%10;    temp=temp/10;   }  a[i]+=temp;    temp=b[i-1];    b[i]=b[i-1];      //计算river 3  while(temp/10!=0)  {    b[i]=b[i]+temp%10;    temp=temp/10;   }  b[i]+=temp;    temp=c[i-1];    c[i]=c[i-1];    //计算river 9  while(temp/10!=0)  {    c[i]=c[i]+temp%10;    temp=temp/10;   }  c[i]+=temp;    }  for(i=0;i<sum;i++)//判断测试数字第最先于河流几相遇  {        flag=1;   while(flag==1)    { for(j=0;j<1000;j++) {  if(a[j]==num[i])  {   flag=0;   cout<<"Case #"<<i+1<<endl;   cout<<"first meets river 1 at "<<num[i]<<endl;   break;  }  if(b[j]==num[i])  {   flag=0;   cout<<"Case #"<<i+1<<endl;   cout<<"first meets river 3 at "<<num[i]<<endl;   break;  }  if(c[j]==num[i])  {   flag=0;   cout<<"Case #"<<i+1<<endl;   cout<<"first meets river 9 at "<<num[i]<<endl;   break;  } }      int temp;    temp=num[i]; while(temp/10!=0) {     num[i]=num[i]+temp%10;     temp=temp/10;  }  num[i]+=temp;   }   }   return 0;}

输出样例:

Case #1first meets river 9 at 117Case #2first meets river 1 at 107

原创粉丝点击