数字河

时限: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)。

输入样例:

117 52 0

#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 #1 first meets river 9 at 117 Case #2 first meets river 1 at 107

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值