数字黑洞

By admin in 4858.com on 2019年3月26日

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

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

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

1019. 数字黑洞 (20)

给定任多少个各位数字大有径庭的四个人正整数,假诺我们先把几个数字按非递增排序,再按非递减排序,然后用第3个数字减第①个数字,将收获一个新的数字。平素重复这么做,大家快捷会停在有“数字黑洞”之称的6174,这几个神奇的数字也叫Kaprekar常数。

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

7766 – 6677 = 1089
9810 – 0189 = 9621
数字黑洞。9621 – 1269 = 8352
8532 – 2358 = 6174
7641 – 1467 = 6174
… …

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

输入格式:

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

出口格式:

一旦N的二位数字全相等,则在一行内输出“N – N =
0000”;不然将总结的每一步在一行内输出,直到6174作为差出现,输出格式见样例。注意每种数字按四位数格式输出。

输入样例1:

6767

出口样例1:

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

输入样例2:

2222

输出样例2:

2222 - 2222 = 0000

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

4858.com 14858.com 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

 下面是贰个自家可怜崇拜的大神写的,拾分简练;

 

4858.com 34858.com 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 }

4858.com,View Code

 

从中学到了成都百货上千东西,关于string的片段操作,在看完c++primer后忘光了。在此立下金光闪闪的flag,一定会在刷PAT进度中再读二回。

任何一个各位数字不全相同的三个人数,经有限次“重排求差”操作,总会收获495。最后所得的495即为三位黑洞数。所谓“重排求差”操作即构成该数的数字重排后的最大数减去重排后的一点都不大数。(6174为肆个人黑洞数。)

别的三个各位数字不全相同的3人数,经有限次“重排求差”操作,总会获得495。最终所得的495即为二位黑洞数。所谓“重排求差”操作即构成该数的数字重排后的最大数减去重排后的细小数。(6174为四位黑洞数。)

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

 

譬如,对4个人数207:

比如说,对4位数207:

比如,对4位数207:

  • 第一次重排求差得:720 – 27 = 693;
  • 第一次重排求差得:963 – 369 = 594;
  • 第2回重排求差得:954 – 459 = 495;
  • 第贰遍重排求差得:720 – 27 = 693;
  • 第三次重排求差得:963 – 369 = 594;
  • 第二遍重排求差得:954 – 459 = 495;

第②次重排求差得:720-027=693;

今后会逗留在495这一黑洞数。借使几个人数的3个数字全相同,叁回转换后即为0。

事后会滞留在495这一黑洞数。如若三人数的贰个数字全相同,1次转换后即为0。

第①次重排求差得:963-369=594;

轻易输入三个三位数,编制程序给出重排求差的历程。

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

第二回重排求差得:954-459=495;

输入格式:

输入在一行中付出二个4人数。

输入格式:

输入在一行中提交三个三个人数。

以往会逗留在495这一黑洞数。要是二位数的三个数字全相同,2次转换后即为0。

输出格式:

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

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

 

序号从1伊始,直到495出现在等号左侧停止。

出口格式:

安分守己以下格式输出重排求差的进程:

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

序号从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地图
Copyright @ 2010-2019 美高梅手机版4858 版权所有