PAT乙題1019. 數字黑洞 (20)

給定任一個各位數字不完全相同的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位數格式輸出。

輸入樣例1:
6767
輸出樣例1:
7766 - 6677 = 1089
9810 - 0189 = 9621
9621 - 1269 = 8352
8532 - 2358 = 6174
輸入樣例2:
2222
輸出樣例2:
2222 - 2222 = 0000

(用數組來進行存儲減速和被減數、商方便計算使用)

#include<stdio.h>
#include<iostream>	//sort
#include<algorithm>
using namespace std;
bool cmp1(int a,int b){
	return a>b;
}
bool cmp2(int a,int b){
	return a<b;
}


int main()
{
	int a[4]={0};
	int n;
	scanf("%d",&n);
	int n2=n;
	int t=3;
	while(n!=0&&t!=-1)
	{
		a[t--]=n%10;
		n=n/10;
	}
	
	if(a[0]==a[1]&&a[1]==a[2]&&a[2]==a[3]){
		printf("%d - %d = 0000",n2,n2);
		return 0;
	}
	int aa,bb;
	int b[4];
	int resultemp=0;
	while(resultemp!=6174)
	{
		for(int i=0;i<4;i++)
			b[i]=a[i];
			
		sort(a,a+4,cmp1);
		sort(b,b+4,cmp2);
		aa=a[0]*1000+a[1]*100+a[2]*10+a[3];
		bb=b[0]*1000+b[1]*100+b[2]*10+b[3];
		resultemp=aa-bb;
		
		printf("%d%d%d%d - %d%d%d%d = ",a[0],a[1],a[2],a[3],b[0],b[1],b[2],b[3]);
		
		for(int i=0;i<4;i++){
			a[i]=b[i]=0;
		}
		t=3;
		while(resultemp!=0&&t!=-1){
			a[t--]=resultemp%10;
			resultemp=resultemp/10;
		}
		resultemp=aa-bb;
		printf("%d%d%d%d\n",a[0],a[1],a[2],a[3]);
	}
	return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章