1019デジタルブラックホール——C/C++実現

3532 ワード

タイトル
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,10 4)区間内の正の整数Nを与える.
出力フォーマット:
Nの4桁の数字がすべて等しい場合、1行にN - N = 0000を出力する.そうでなければ、6174が差として現れるまで、計算された各ステップを1行に出力し、出力フォーマットは例を参照してください.注意各数字は4桁で出力されます.
サンプル1を入力:
6767

出力サンプル1:
7766 - 6677 = 1089
9810 - 0189 = 9621
9621 - 1269 = 8352
8532 - 2358 = 6174

入力サンプル2:
2222

出力サンプル2:
2222 - 2222 = 0000

アルゴリズム#アルゴリズム#
今この問題をして、すでにsort関数を使うことをマスターして、そのためとても簡単で、とても節約しました.以前書いたCを見てみたが、実は考え方は変わっていない.ただ、より多くの知識を身につけるため、コード量が大幅に減少し、元の2つのサブ関数はここで2つのsort()文にすぎない.ツールはとても重要で、ツールは人の思考を形作ることができます.コード1/2の2つの部分を参照してください.
リュウインのコードを見て、数字を文字列として処理しますが、4桁のゼロ補完が足りない問題も解決しなければなりません.それに比べて、数字計算にはこの問題はありません.しかし、皆さんの数字を取り出すのは面倒です.コード3を参照してください.
アルゴリズム:毎回4つの数字を言って取り出してから昇順に並べて、降順に並べて、作差直道は6174と0000で停止します.
コード#コード#
コード1、C
//PAT1019V1
#include 

int FeiDiZeng(int n){
	int a[4];
	a[0]=n%10;	//ge
	a[1]=n/10%10;	//shi
	a[2]=n/100%10;	//bai
	a[3]=n/1000;	//qian
	int tmp,i,j;
	for(i=0;i<3;i++){
		for(j=i+1;j<4;j++){
			if(a[i]a[j]){
tmp=a[j];
a[j]=a[i];
a[i]=tmp;
}
}
}
return a[0]*1000+a[1]*100+a[2]*10+a[3];	
}
int main(){
int n,a[4];
scanf("%d",&n);
a[0]=n%10;	//ge
a[1]=n/10%10;	//shi
a[2]=n/100%10;	//bai
a[3]=n/1000;	//qian
//	if(a[0]==a[1]==a[2]==a[3]){	//debug
if(a[0]==a[1]&&a[1]==a[2]&&a[2]==a[3]){	
printf("%d - %d = 0000",n,n);
}
else{
int FDZ=FeiDiZeng(n),FDJ=FeiDiJian(n);	
while(FDZ-FDJ!=6174){
const int result=FDZ-FDJ;
printf("%04d - %04d = %04d",FDZ,FDJ,result);
FDZ=FeiDiZeng(result);
FDJ=FeiDiJian(result);
}
printf("%04d - %04d = %04d",FDZ,FDJ,FDZ-FDJ);
}	
}

コード2、C++
//1019
#include 
#include 
using namespace std;

int cmp(int a,int b){	//max to min 
	return a>b?1:0;
}
int main(){
	int n,a[4]={0},b,c,t;	cin>>n;
	t=n;
	do{
		a[0]=t/1000;
  		a[1]=t%1000/100;
		a[2]=t%1000%100/10;
		a[3]=t%10;
		sort(a,a+4,cmp);
		b=a[0]*1000	+a[1]*100+a[2]*10+a[3];
		sort(a,a+4);	//min to max
		c=a[0]*1000	+a[1]*100+a[2]*10+a[3];
		t=b-c;
		printf("%04d - %04d = %04d
",b,c,t); }while(t!=6174&&t!=0000); return 0; }

コード3、柳
#include 
#include 
using namespace std;
bool cmp(char a, char b) {return a > b;}
int main() {
    string s;
    cin >> s;
    s.insert(0, 4 - s.length(), '0');
    do {
        string a = s, b = s;
        sort(a.begin(), a.end(), cmp);
        sort(b.begin(), b.end());
        int result = stoi(a) - stoi(b);
        s = to_string(result);
        s.insert(0, 4 - s.length(), '0');
        cout << a << " - " << b << " = " << s << endl;
    } while (s != "6174" && s != "0000");
    return 0;
}