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