1019デジタルブラックホール——C/C++実現
3532 ワード
タイトル
1019デジタルブラックホール(20分)
各桁の数字が全く同じではない4桁の正の整数を指定します.まず、4つの数字を非増分順に並べてから、非増分順に並べて、1番目の数字で2番目の数字を減らすと、新しい数字が得られます.これを繰り返すと、私たちはすぐに「デジタルブラックホール」と呼ばれる
例えば
任意の4ビットの正の整数を指定し、ブラックホールに到達するプロセスを示すプログラムを作成します.
入力形式:
入力は、(0,10 4)区間内の正の整数Nを与える.
出力フォーマット:
Nの4桁の数字がすべて等しい場合、1行に
サンプル1を入力:
出力サンプル1:
入力サンプル2:
出力サンプル2:
アルゴリズム#アルゴリズム#
今この問題をして、すでにsort関数を使うことをマスターして、そのためとても簡単で、とても節約しました.以前書いたCを見てみたが、実は考え方は変わっていない.ただ、より多くの知識を身につけるため、コード量が大幅に減少し、元の2つのサブ関数はここで2つのsort()文にすぎない.ツールはとても重要で、ツールは人の思考を形作ることができます.コード1/2の2つの部分を参照してください.
リュウインのコードを見て、数字を文字列として処理しますが、4桁のゼロ補完が足りない問題も解決しなければなりません.それに比べて、数字計算にはこの問題はありません.しかし、皆さんの数字を取り出すのは面倒です.コード3を参照してください.
アルゴリズム:毎回4つの数字を言って取り出してから昇順に並べて、降順に並べて、作差直道は6174と0000で停止します.
コード#コード#
コード1、C
コード2、C++
コード3、柳
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;
}