数字黑洞

数字黑洞。黑洞数也叫做陷阱数,又称“Kaprekar难题”,是一类具备奇特调换性情的数。

黑洞数也号称陷阱数,又称“Kaprekar难题”,是1类具有奇特转变天性的数。

101九. 数字黑洞 (20)

给定任1个各位数字不完全同样的二个人正整数,若是大家先把四个数字按非递增排序,再按非递减少排放序,然后用第3个数字减第1个数字,将取得一个新的数字。一直重复这么做,大家飞快会停在有“数字黑洞”之称的617肆,这些玄妙的数字也叫Kaprekar常数。

例如,我们从6767开始,将得到

7766 – 6677 = 1089
9810 – 0189 = 9621
9621 – 1269 = 8352
8532 – 2358 = 6174
7641 – 1467 = 6174
… …

现给定任性二个人正整数,请编写程序演示达到黑洞的进度。

输入格式:

输入给出几个(0, 10000)区间内的正整数N。

输出格式:

万一N的三位数字全相等,则在一行内输出“N – N =
0000”;不然将总计的每一步在壹行内输出,直到617四看成差出现,输出格式见样例。注意每种数字按肆人数格式输出。

输入样例壹:

6767

输出样例壹:

7766 - 6677 = 1089
9810 - 0189 = 9621
9621 - 1269 = 8352
8532 - 2358 = 6174

输入样例二:

2222

出口样例二:

2222 - 2222 = 0000

自己编写的代码:(感觉比较臃肿,但运行速度还是可以的)

美高梅开户网址 1美高梅开户网址 2

 1 #include<iostream>
 2 #include<sstream>
 3 #include<math.h>
 4 #include<iomanip>
 5 using namespace std;
 6 void Insertion_sort(int a[],int N){
 7 int i,j; 
 8 for(i=1;i<N;i++){
 9 int temp=a[i];
10 for(j=i;j>0;j--)
11 if(a[j-1]>temp) swap(a[j-1],a[j]);
12 else break;
13 a[j]=temp;
14 }
15 } 
16 int main(){
17 string s;
18 cin>>s;
19 s.insert(0,4-s.length(),'0');
20 int a[4];
21 int r=0;
22 while(r!=6174){
23 int m=0,n=0;
24 for(int i=0;i<4;i++)
25 a[i]=s[i]-'0';
26 Insertion_sort(a,4);
27     for(int i=0;i<4;i++){
28     m+=a[i]*pow(10,i);
29     n+=a[i]*pow(10,3-i);
30 }
31 r=m-n;
32 cout<<setw(4)<<setfill('0')<<m;
33 cout<<" - "; cout<<setw(4)<<setfill('0')<<n;
34 cout<<" = "; cout<<setw(4)<<setfill('0')<<r<<endl;
35 if(r==0) break;
36 ostringstream os;
37 os<<setw(4)<<setfill('0')<<r;
38 s=os.str();
39 }
40 return 0; 
41 } 

View Code

 下面是二个自己充裕崇拜的大神写的,10分简练;

 

美高梅开户网址 3美高梅开户网址 4

 1 #include <iostream>
 2 #include <string>
 3 using namespace std;
 4  
 5 int main() {
 6     string s;
 7     cin >> s;
 8     int a;
 9     cin >> a;
10     int len = s.length();
11     int t = 0;
12     int temp = 0;
13     t = (s[0] - '0') / a;
14     if ((t != 0 && len > 1) || len == 1) {
15         cout << t;
16     }
17     temp = (s[0] - '0') % a;
18     for (int i = 1; i < len; i++) {
19         t = (temp * 10 + s[i] - '0') / a;
20         cout << t;
21         temp = (temp * 10 + s[i] - '0') % a;
22     }
23     cout << " " << temp;
24     return 0;
25 }

View Code

 

从中学到了累累事物,关于string的有的操作,在看完c++primer后忘光了。在此立下金光闪闪的flag,一定会在刷PAT进度中再读2次。

别的贰个各位数字不全一样的三人数,经有限次“重排求差”操作,总会博得495。最终所得的4玖伍即为3个人黑洞数。所谓“重排求差”操作即整合该数的数字重排后的最大数减去重排后的细微数。(617四为四个人黑洞数。)

其余三个数字不全一样的几人数,经有限次“重排求差”操作,总会获取4玖5。最后所得的4玖5即为三个人黑洞数。所谓“重排求差”操作即整合该数的数字重排后的最大数减去重排后的细微数。(617四为4人黑洞数)

 

比方,对四位数20七:

比方说,对多少人数207:

  • 第三回重排求差得:720 – 27 = 693;
  • 第贰次重排求差得:玖陆3 – 36九 = 5玖4;
  • 第2遍重排求差得:95四 – 45玖 = 49五;

第二次重排求差得:720-0二七=6玖3;

其后会逗留在49五那一黑洞数。假设几个人数的一个数字全一样,贰遍转换后即为0。

第二次重排求差得:九六三-36九=5九肆;

随便输入三个3人数,编制程序给出重排求差的长河。

第一次重排求差得:954-45玖=495;

输入格式:

输入在1行中付出贰个三人数。

从此会滞留在4九5那一黑洞数。假若二人数的三个数字全同样,一回转变后即为0。

输出格式:

规行矩步以下格式输出重排求差的过程:

序号: 数字重排后的最大数 - 重排后的最小数 = 差值

 

序号从一发端,直到495出现在等号左边截至。

自由输入二个4人数,编制程序给出重排求差的进程。

美高梅开户网址,输入样例:

123

输入输出示例:括号内是注明

输出样例:

1: 321 - 123 = 198
2: 981 - 189 = 792
3: 972 - 279 = 693
4: 963 - 369 = 594
5: 954 - 459 = 495

 

 1 #include <stdio.h>
 2 
 3 int number(int a[], int len, int flag);
 4 int max(int a[], int len);
 5 void dd(int a[], int n);
 6 
 7 int main(int argc, char const *argv[])
 8 {
 9     int n;
10     int a[3];
11 
12     scanf("%d", &n);
13 
14     int len = sizeof(a)/sizeof(a[0]);
15     
16     // 输入的数是495也要输出一次
17     for ( int i = 1; n != 495 || i == 1; i++ ) {
18         dd(a,n);
19         //    选择排序
20         for ( int i = len-1; i > 0; i-- ) {
21             int maxid = max(a,i+1);
22             // swap a[maxid], a[len-1]
23             int t = a[maxid];
24             a[maxid] = a[i];
25             a[i] = t;
26         }
27         // 1-->mim 0-->max
28         int min = number(a,sizeof(a)/sizeof(a[0]),1);
29         int max = number(a,sizeof(a)/sizeof(a[0]),0);
30         if ( min == max ) {    // 三位数的3个数是否相同
31             printf("%d: %d - %d = %d\n", i, max, min, max-min);
32             break;
33         } else {
34             printf("%d: %d - %d = %d\n", i, max, min, max-min);
35         }
36         n = max - min;
37     }
38     
39     return 0;
40 }
41 
42 int number(int a[], int len, int flag)
43 {
44     int num = 0;
45     if ( flag ) {
46         for ( int i = 0; i < len; i++ ) {
47             num = num * 10 + a[i];
48         }
49     } else {
50         for ( int i = len-1; i >= 0; i-- ) {
51             num = num * 10 + a[i];
52         }
53     }
54     return num;
55 }
56 
57 int max(int a[], int len)
58 {
59     int maxid = 0;
60     int i;
61     for ( i = 1; i < len; i++ ) {
62         if ( a[i] > a[maxid] ) {
63             maxid = i;
64         }
65     }
66     return maxid;
67 }
68 
69 void dd(int a[], int n)
70 {
71     a[0] = n / 100;
72     a[1] = n / 10 % 10;
73     a[2] = n % 10;
74 }

 

输入

123

输出

1: 321 – 123 = 198

2: 981 – 189 = 792

3: 972 – 279 = 693

4: 963 – 369 = 594

5: 954 – 459 = 495

#include<stdio.h>

int main(void)

{

int number,x,y,a,b,c,t,i,max,min,mid;

    scanf(“%d”,&number);i=1;

while(number!=495)

{

a=number/100;

b=number%100/10;

c=number%10;

mid=a+b+c;

max=a>b?a:b; max=max>c?max:c;

min=a>b?b:a; min=min>c?c:min;

mid=mid-min-max;

x=max*100+mid*10+min;

y=min*100+mid*10+max;

/*———*/

number=x-y;

printf(“%d: %d – %d = %d\n”,i,x,y,number);

i++;

}

return 0;

}

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图