pat 乙级 1019 数字黑洞(C++)
生活随笔
收集整理的這篇文章主要介紹了
pat 乙级 1019 数字黑洞(C++)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目
給定任一個各位數字不完全相同的 4 位正整數,如果我們先把 4 個數字按非遞增排序,再按非遞減排序,然后用第 1 個數字減第 2 個數字,將得到一個新的數字。一直重復這樣做,我們很快會停在有“數字黑洞”之稱的 6174,這個神奇的數字也叫 Kaprekar 常數。
例如,我們從6767開始,將得到
7766 - 6677 = 1089 9810 - 0189 = 9621 9621 - 1269 = 8352 8532 - 2358 = 6174 7641 - 1467 = 6174 ... ...現給定任意 4 位正整數,請編寫程序演示到達黑洞的過程。
輸入格式:
輸入給出一個 (0,104) 區間內的正整數 N。
輸出格式:
如果 N 的 4 位數字全相等,則在一行內輸出 N - N = 0000;否則將計算的每一步在一行內輸出,直到 6174 作為差出現,輸出格式見樣例。注意每個數字按 4 位數格式輸出。
輸入樣例 1:
6767輸出樣例 1:
7766 - 6677 = 1089 9810 - 0189 = 9621 9621 - 1269 = 8352 8532 - 2358 = 6174輸入樣例 2:
2222輸出樣例 2:
2222 - 2222 = 0000分析
- 對輸入的整數N%10,N/10 交替進行,直到把每一位的數取出來。然后進行排序
- 排序使用C++的sort函數,頭文件algorithm,需自己定義第三個參數
- 這里需要注意輸入格式
AC代碼
原代碼
#include<iostream> #include<algorithm> using namespace std; bool comp1(int a,int b)//非遞增排序 {return a>=b; } bool comp2(int a,int b)//非遞減排序 {return a<=b; } int main() {int i,N,a[4];int x,y,z;cin>>N;for(i=0;i<4;i++){a[i]=N%10;N=N/10;}sort(a,a+4,comp1);x=a[0]*1000+a[1]*100+a[2]*10+a[3];sort(a,a+4,comp2);y=a[0]*1000+a[1]*100+a[2]*10+a[3];if(x==y){cout<<x<<" - "<<y<<" = "<<"0000";} else{z=x-y;while(1) {if(z==6174){cout<<x<<" - "<<y<<" = "<<z; break;}if(y<1000||z<1000) {int b[4];string str="",str2="";for(i=3;i>=0;i--){a[i]=z%10;b[i]=y%10;y=y/10;z=z/10;}for(i=0;i<4;i++){str=str+to_string(a[i]);str2=str2+to_string(b[i]);}cout<<x<<" - "<<str2<<" = "<<str<<endl;}else{cout<<x<<" - "<<y<<" = "<<z<<endl;for(i=0;i<4;i++){a[i]=z%10;z=z/10;}} sort(a,a+4,comp1);x=a[0]*1000+a[1]*100+a[2]*10+a[3];sort(a,a+4,comp2);y=a[0]*1000+a[1]*100+a[2]*10+a[3];z=x-y;} }return 0; }優化后代碼
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; bool comp1(int a,int b)//非遞增排序 {return a>=b; } bool comp2(int a,int b)//非遞減排序 {return a<=b; } int main() {int i,N,a[4];int x,y,z;cin>>N;for(i=0;i<4;i++){a[i]=N%10;N=N/10;}sort(a,a+4,comp1);x=a[0]*1000+a[1]*100+a[2]*10+a[3];sort(a,a+4,comp2);y=a[0]*1000+a[1]*100+a[2]*10+a[3];if(x==y){cout<<x<<" - "<<y<<" = "<<"0000";} else{z=x-y;while(1) {if(z==6174){cout<<x<<" - "<<y<<" = "<<z; break;}printf("%d - %04d = %04d\n",x,y,z);//不足4位在左邊自動補0for(i=0;i<4;i++){a[i]=z%10;z=z/10;}sort(a,a+4,comp1);x=a[0]*1000+a[1]*100+a[2]*10+a[3];sort(a,a+4,comp2);y=a[0]*1000+a[1]*100+a[2]*10+a[3];z=x-y;} }return 0; }充分利用C語言和C++的特長,能夠使代碼更簡潔,運行時間更少。
如果你有什么問題或者更好的解法,記得來評論區留言一起交流哦
更多題解
pat 乙級 題解匯總(持續更新)(C++)
總結
以上是生活随笔為你收集整理的pat 乙级 1019 数字黑洞(C++)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 人力资源局备案(人事厅备案)
- 下一篇: 西部数据备案(西部云备案)