黑洞数也称之为陷阱数,又称“Kaprekar难点”,是壹类具有奇特转换天性的数。

黑洞数也叫做陷阱数,又称“Kaprekar难题”,是一类具有奇特转换个性的数。

黑洞数也叫做陷阱数,又称“Kaprekar难点”,是一类具有奇特转换性格的数。

101玖. 数字黑洞 (20)

给定任二个各位数字大有径庭的二人正整数,如若大家先把6个数字按非递增排序,再按非递减排序,然后用第贰个数字减第一个数字,将获取一个新的数字。平昔重复这么做,大家相当慢会停在有“数字黑洞”之称的617四,那个神奇的数字也叫Kaprekar常数。

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

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

现给定任意几个人正整数,请编写程序演示到达黑洞的历程。

输入格式:

数字黑洞。输入给出1个(0, 一千0)区间内的正整数N。

出口格式:

假如N的4个人数字全相等,则在1行内输出“N – N =
0000”;不然将总结的每一步在壹行内输出,直到617四当做差出现,输出格式见样例。注意各个数字按三个人数格式输出。

输入样例1:

6767

出口样例1:

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

输入样例二:

2222

输出样例二:

2222 - 2222 = 0000

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

金沙注册送58 1金沙注册送58 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

 下面是3个作者那一个崇拜的大神写的,十三分简洁;

 

金沙注册送58 3金沙注册送58 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进程中再读三遍。

此外一个各位数字不全相同的4位数,经有限次“重排求差”操作,总会赢得495。最终所得的4玖伍即为3位黑洞数。所谓“重排求差”操作即构成该数的数字重排后的最大数减去重排后的纤维数。(617肆为叁个人黑洞数。)

其余三个各位数字不全相同的三人数,经有限次“重排求差”操作,总会收获4九五。最终所得的495即为几人黑洞数。所谓“重排求差”操作即构成该数的数字重排后的最大数减去重排后的纤维数。(6174为3位黑洞数。)

任何2个数字不全相同的三个人数,经有限次“重排求差”操作,总会取得4玖伍。最后所得的4九伍即为三位黑洞数。所谓“重排求差”操作即构成该数的数字重排后的最大数减去重排后的纤维数。(6174为贰个人黑洞数)

 

譬如,对多少人数20七:

比如说,对2人数207:

比如,对3位数20七:

  • 第1次重排求差得:720 – 27 = 6玖叁;
  • 金沙注册送58 ,第一次重排求差得:玖六叁 – 36九 = 5九四;
  • 第2次重排求差得:954 – 45玖 = 4玖伍;
  • 第壹回重排求差得:720 – 二七 = 693;
  • 第一次重排求差得:玖六三 – 36九 = 594;
  • 第二回重排求差得:954 – 45玖 = 495;

第二次重排求差得:720-0二7=693;

从此今后会滞留在495那一黑洞数。假使三位数的一个数字全相同,3遍转换后即为0。

然后会停留在4玖伍那1黑洞数。假如3个人数的二个数字全相同,一回转换后即为0。

第1次重排求差得:96三-36玖=5玖四;

四意输入三个几人数,编程给出重排求差的进程。

随便输入2个二个人数,编程给出重排求差的历程。

第一回重排求差得:95肆-459=495;

输入格式:

输入在1行中提交叁个3个人数。

输入格式:

输入在1行中付出四个四位数。

今后会停留在4玖伍那壹黑洞数。借使三人数的一个数字全相同,一回转换后即为0。

输出格式:

根据以下格式输出重排求差的经过:

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

 

序号从壹上马,直到49伍出现在等号左边甘休。

输出格式:

遵循以下格式输出重排求差的长河:

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

序号从1发端,直到495出现在等号右边停止。

四意输入一个多少人数,编制程序给出重排求差的进度。

输入样例:

123

输入样例:

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 }

 

输出样例:

1: 321 - 123 = 1982: 981 - 189 = 7923: 972 - 279 = 6934: 963 - 369 = 5945: 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/sizeof(a[0]);15     16     // 输入的数是495也要输出一次17     for ( int i = 1; n != 495 || i == 1; i++ ) {18         dd;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-->max28         int min = number(a,sizeof/sizeof(a[0]),1);29         int max = number(a,sizeof/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  {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地图