之前看题的时候没有注意到每一个数最后都会有了循环这句话,解决了这个问题后又开始担心数组太大开不下10的9次方。但讨论了下最大的那个数也是81*10
所以开1000就够了。然后我们设置一个visit数组,来表示数字是否出现过,,以及出现了几次。对于读入的两个数a,b如果大于1000那么他不存入visit数组
对于a求出他的合乎要求的序列,对于b在开一个visitb数组,求出b的序列,同时在visit里面也要标记,然后遍历visit数组,那么出现两次的地方就是有交点的地方,为了加速
我们开数组p来表示每一数对应的出现的次序,特别要注意大于1000的情况要加上之前的步数。
#include<iostream> #include<string.h> #include<stdio.h> #include<algorithm> #define inf 0x7fffffff using namespace std; int visit[15000]; int vb[15000]; long long p[2][10000]; long long ok(long long m) { long long sum=0; while(m>0) { int a=m%10; sum+=a*a; m/=10; } return sum; } int main() { long long a; long long b; int oo=2; int oo1=0; while(cin>>a>>b) { long long t1=a; long long t2=b; if(a==0&&b==0)break; memset(visit,0,sizeof(visit)); memset(vb,0,sizeof(vb)); memset(p,0,sizeof(p)); if(a==b)cout<<a<<" "<<b<<" "<<oo<<endl; else { int counta=0; int countb=0; if(a<=1000)p[0][a]=++counta,visit[a]=1; while(1) { long long tempa=ok(a); if(visit[tempa]==0)p[0][tempa]=++counta,visit[tempa]++,a=tempa; else break; } if(b<=1000)p[1][b]=++countb,visit[b]++,vb[b]=1; while(1) { long long tempb=ok(b); if(vb[tempb]==0)p[1][tempb]=++countb,visit[tempb]++,vb[tempb]=1,b=tempb; else break; } long long ans=inf; int flage=0; for(int i=0;i<1500;i++) { if(visit[i]==2) { flage=1; if(t1>1000&&t2>1000) ans=min(ans,p[0][i]+p[1][i]+2); else if(t1>1000||t2>1000) {ans=min(ans,p[0][i]+p[1][i]+1);} else ans=min(ans,p[0][i]+p[1][i]); } } if(flage==1) cout<<t1<<" "<<t2<<" "<<ans<<endl; else cout<<t1<<" "<<t2<<" "<<oo1<<endl; } } return 0; }