數字黑洞 (20)
阿新 • • 發佈:2021-02-09
技術標籤:乙級
- 數字黑洞 (20)
時間限制 1000 ms 記憶體限制 32768 KB 程式碼長度限制 100 KB 判斷程式 Standard (來自 小小)
題目描述
給定任一個各位數字不完全相同的4位正整數,如果我們先把4個數字按非遞增排序,再按非遞減排序,然後用第1個數字減第2個數字,將得到
一個新的數字。一直重複這樣做,我們很快會停在有“數字黑洞”之稱的6174,這個神奇的數字也叫Kaprekar常數。
例如,我們從6767開始,將得到
7766 - 6677 = 1089
9810 - 0189 = 9621
9621 - 1269 = 8352
8532 - 2358 = 6174
7641 - 1467 = 6174
現給定任意4位正整數,請編寫程式演示到達黑洞的過程。
輸入描述:
輸入給出一個(0, 10000)區間內的正整數N。
輸出描述:
如果N的4位數字全相等,則在一行內輸出“N - N = 0000”;否則將計算的每一步在一行內輸出,直到6174作為差出現,輸出格式見樣例,每行中間沒有空行。注意每個數字按4位數格 式輸出。
stoi()函式把數字字串轉化為int型
輸入例子:
6767
輸出例子:
7766 - 6677 = 1089
9810 - 0189 = 9621
9621 - 1269 = 8352
8532 - 2358 = 6174
演算法思想:
轉換成陣列形式排序,做減法,直到得到6147;
注意控制輸出格式%0寬度d控制輸出格式;
轉換回整數形式,*10+;
#include <bits/stdc++.h>
using namespace std;
int main() {
int n,j,cnt;
cin>>n;
int s1[4];
if(n==6174)//特殊處理當n=6147
cout<<"7641 - 1467 = 6174"<<endl;
while(n!=6174)
{
int m=4;
j=0;
cnt=0;
while(m--)//轉換成陣列形式
{
s1[j]=n%10;
n/ =10;
j++;
}
sort(s1,s1+j);//sort排序,預設增序排列
int max=0,min=0;
for(int i=0;i<4;++i)//轉換成整數形式
{
max=max*10+(s1[3-i]);
min=min*10+s1[i];
if(s1[i]==0)
cnt++;
}
n=max-min;
// cout<<max<<" - ";
// while(cnt--)//補足0位
// {
// cout<<"0";
//
// }
// cout<<min<<" = "<<n<<endl;
printf("%04d - %04d = %04d\n",max,min,n);//%0寬度d,補足0位
}
return 0;
}
演算法二:更為簡潔,
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int main()
{
string num;
cin>>num;
while(num.length()<4){//用string中的+,<1000的整數處理
num="0"+num;
}
while(1){
//利用反向迭代器
sort(num.rbegin(),num.rend());//降序
string num1=num;
sort(num.begin(),num.end());//升序
string num2=num;
if(num1==num2){//考慮四位數字為向同時的情況
cout<<num1<<" - "<<num2<<" = 0000"<<endl;
break;
}
num=to_string(stoi(num1)-stoi(num2));//stoi把數字字串轉化為int型
cout<<num1<<" - "<<num2<<" = "<<num<<endl;
if(num=="6174") break;
}
return 0;
}