6174问题

/*--------6174问题-----------
输入一个n位数,把所有数字从大到小排序得到a,从小到大得到b,然后用a-b替换原来这个数
并且继续操作。1234 、4321-1234=3087、8730-378=8352、8532-2358=6174 
样例输入:1234
样例输出:1234->3087->8352->6074->6174
--------------------------------------------------*/ 

  1. #include<iostream>  
  2. #include<string>  
  3. using namespace std;  
  4. int get_next(int x)  
  5. {  
  6. int n,a,b=0;  
  7. char s[10];  
  8. sprintf(s,"%d",x);  
  9.     n=strlen(s);  
  10.     /*冒泡排序,先得到从大到小a,在逆转成b,这样就不会丢失0 
  11. 例如,3087,如果先得到b=378,则a=873,a本应为8730*/   
  12. for(int i=0;i<n;i++)  
  13.    for(int j=i+1;j<n;j++)  
  14.     if(s[i]<s[j]){char t=s[i];s[i]=s[j];s[j]=t;}  
  15. sscanf(s,"%d",&a);  
  16. int t=a;  
  17. while(t>0)  
  18. {  
  19.    b=b*10+t%10;  
  20.    t=t/10;  
  21. }  
  22.   
  23. return a-b;  
  24. }  
  25. int main()  
  26. {  
  27.   
  28.   
  29. int num[1000],count;  
  30.    cin>>num[0];  
  31.    cout<<num[0];  
  32.    count=1;  
  33.    for(;;)  
  34.    {  
  35.      num[count]=get_next(num[count-1]);  
  36. cout<<"->"<<num[count];  
  37. int found=0;  
  38. for(int i=0;i<count;i++)  
  39.    if(num[i]==num[count]){found=1;break;}  
  40.    if(found) break;  
  41.    count++;  
  42.    }  
  43.     
  44.   
  45. cout<<endl;  
  46. return 0;  
  47. }  
永不止步步 发表于02-07 09:11 浏览65535次
分享到:

已有0条评论

暂时还没有回复哟,快来抢沙发吧

添加一条新评论

只有登录用户才能评论,请先登录注册哦!

话题作者

永不止步步
金币:67410个|学分:308417个
立即注册
畅学电子网,带你进入电子开发学习世界
专业电子工程技术学习交流社区,加入畅学一起充电加油吧!

x

畅学电子网订阅号