威尼斯人线上娱乐

数字黑洞

11 4月 , 2019  

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

威尼斯人线上娱乐,黑洞数也号称陷阱数,又称“Kaprekar难点”,是1类具有奇特转换个性的数。

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

101九. 数字黑洞 (20)

给定任1个各位数字有差别的几个人正整数,如果大家先把多少个数字按非递增排序,再按非递减排序,然后用第1个数字减第3个数字,将获取贰个新的数字。一向重复这么做,大家快速会停在有“数字黑洞”之称的6174,这些神奇的数字也叫Kaprekar常数。

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

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

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

输入格式:

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

输出格式:

假设N的二人数字全相等,则在一行内输出“N – N =
0000”;不然将总计的每一步在一行内输出,直到617四当做差出现,输出格式见样例。注意每一个数字按几位数格式输出。

输入样例壹:

6767

输出样例1:

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

 下面是1个本身充裕崇拜的大神写的,十三分简单;

数字黑洞。 

威尼斯人线上娱乐 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进程中再读三次。

任何3个各位数字不全相同的四人数,经有限次“重排求差”操作,总会博得4九伍。最终所得的4玖5即为四位黑洞数。所谓“重排求差”操作即整合该数的数字重排后的最大数减去重排后的矮小数。(617四为四个人黑洞数。)

其余1个各位数字不全相同的贰人数,经有限次“重排求差”操作,总会收获495。最终所得的4九五即为几个人黑洞数。所谓“重排求差”操作即整合该数的数字重排后的最大数减去重排后的矮小数。(617四为多少人黑洞数。)

其余一个数字不全相同的4个人数,经有限次“重排求差”操作,总会取得4九伍。最终所得的4九5即为几位黑洞数。所谓“重排求差”操作即构成该数的数字重排后的最大数减去重排后的蝇头数。(6174为二位黑洞数)

 

譬如说,对二人数20七:

比如,对多少人数20柒:

诸如,对四个人数20七:

  • 第三次重排求差得:720 – 二柒 = 6玖三;
  • 第壹次重排求差得:玖陆3 – 36九 = 5玖四;
  • 第1遍重排求差得:95四 – 45九 = 495;
  • 第1回重排求差得:720 – 二7 = 6九3;
  • 第一次重排求差得:九陆三 – 369 = 5九四;
  • 第三遍重排求差得:954 – 45玖 = 495;

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

后来会滞留在495那一黑洞数。若是四个人数的二个数字全相同,二遍转换后即为0。

以往会停留在495那一黑洞数。借使肆个人数的二个数字全相同,一次转换后即为0。

第二次重排求差得:9陆3-36玖=594;

随意输入1个贰人数,编制程序给出重排求差的历程。

私下输入2个四个人数,编制程序给出重排求差的经过。

第壹回重排求差得:95四-45九=4玖5;

输入格式:

输入在一行中提交贰个3位数。

输入格式:

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

后来会停留在4九伍那一黑洞数。假若二人数的2个数字全相同,3遍转换后即为0。

输出格式:

依照以下格式输出重排求差的进度:

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

 

序号从一起来,直到4九5出现在等号左边甘休。

出口格式:

依据以下格式输出重排求差的历程:

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

序号从一起首,直到4九伍出现在等号左边截止。

自由输入1个二位数,编制程序给出重排求差的长河。

输入样例:

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地图