1. 程式人生 > 其它 >數字黑洞 (20)

數字黑洞 (20)

技術標籤:乙級

  1. 數字黑洞 (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;
}