描述:
数字河中的一个数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
输出样例:
Case #1 first meets river 9 at 117 Case #2 first meets river 1 at 107
#include<iostream>
using namespace std;
int main()
{
int n,n1,a,a1,b,b1,c,c1,i,e,x,sum;
int A[100000],B[100000],C[100000],N[100000],Y[100000];
for(e=0;;e++)
{
cin>>Y[e];
if(Y[e]==0)
{
break;
}
}
for(x=0;x<e;x++)
{
a=0;b=0;c=0;A[0]=1;B[0]=3;C[0]=9;
N[0]=Y[x];n=0;
for(;;)
{
for(;;)
{
if(A[a]<N[n])
{
sum=0;
A[a+1]=A[a];
for(;A[a]>0;)
{
a1=A[a]%10;
sum=sum+a1;
A[a]=A[a]/10;
}
A[a+1]=A[a+1]+sum;
a=a+1;
}
else
{
break;
}
}
for(;;)
{
if(B[b]<N[n])
{
sum=0;
B[b+1]=B[b];
for(;B[b]>0;)
{
b1=B[b]%10;
sum=sum+b1;
B[b]=B[b]/10;
}
B[b+1]=B[b+1]+sum;
b=b+1;
}
else
{
break;
}
}
for(;;)
{
if(C[c]<N[n])
{
sum=0;
C[c+1]=C[c];
for(;C[c]>0;)
{
c1=C[c]%10;
sum=sum+c1;
C[c]=C[c]/10;
}
C[c+1]=C[c+1]+sum;
c=c+1;
}
else
{
break;
}
}
if(A[a]==N[n])
{
cout<<"Case #"<<x+1<<endl;
cout<<"first meets river 1 at "<<N[n]<<endl;
break;
}
else if(B[b]==N[n])
{
cout<<"Case #"<<x+1<<endl;
cout<<"first meets river 3 at "<<N[n]<<endl;
break;
}
else if(C[c]==N[n])
{
cout<<"Case #"<<x+1<<endl;
cout<<"first meets river 9 at "<<N[n]<<endl;
break;
}
else
{
sum=0;
N[n+1]=N[n];
for(;N[n]>0;)
{
n1=N[n]%10;
sum=sum+n1;
N[n]=N[n]/10;
}
N[n+1]=N[n+1]+sum;
n=n+1;
}
}
}
}