假设你有一个各位数字互不相同的四位数,把所有数字从大到小排序后得到a,从小到大排序后得到b,然后用a-b替换原来这个数,并且继续操作。
例如,从1234出发,依次可以得到4321-1234=3087、8730-378=8352、8532-2358=6174、7641-1467=6174。有趣的是,最后回到了自己。
要求:
输入一个n位数,输出操纵序列,直到出现循环(即新得到的数曾经得到过)。输入保证在循环之前最多只会产生1000个整数。
样例输入:1234
样例输出:1234 -> 3087 -> 8352 -> 6174 -> 6174
[分析]
需要解决的问题有:
[1] 如何得到下一个数?
首先需要把各个数字排序,因此需要把各个数字提取出来。然后选择一种排序算法,先将提取的数字所组成的数组按照从小到大排序,然后再将其逆序,然后就可以得到下一个数了。
[2] 如何检查这个数是否已经出现过了?
这个可以通过数组来实现。将每次得到的数字保存到一个数组中,然后遍历这个数组就可以判断这个数字是否已经得到过。
注意输入如果不是四位数 , 或者4个数字完全相同,则忽略否则会WA
1 #include <stdio.h> 2 #include <math.h> 3 #include <string.h> 4 #include <stdlib.h> 5 #include <string.h> 6 #include <iostream> 7 #include <algorithm> 8 using namespace std; 9 int n, i, j, k; 10 int num1[5], num2[5], tar[5]; 11 bool cmp1(int x, int y){ 12 return x > y; 13 } 14 bool init(){ 15 if(n > 9999 || n < 1000) return false; 16 num1[1] = n / 1000; 17 num1[2] = n / 100; 18 num1[2] %= 10; 19 num1[3] = n / 10; 20 num1[3] %= 10; 21 num1[4] = n - 1000 * num1[1] - 100 * num1[2] - 10 * num1[3]; 22 if(num1[1] == num1[2] && num1[2] == num1[3]23 && num1[3] == num1[4]) return false; 24 return true; 25 } 26 void deal(){ 27 num1[1] = n / 1000; 28 num1[2] = n / 100; 29 num1[2] %= 10; 30 num1[3] = n / 10; 31 num1[3] %= 10; 32 num1[4] = n - 1000 * num1[1] - 100 * num1[2] - 10 * num1[3]; 33 num2[1] = num1[1]; 34 num2[2] = num1[2]; 35 num2[3] = num1[3]; 36 num2[4] = num1[4]; 37 sort(num1+1, num1+1+4); 38 sort(num2+1, num2+1+4,cmp1); 39 if(n < 1000 && n >= 100){ 40 num2[4] = num2[3]; 41 num2[3] = num2[2]; 42 num2[2] = num2[1]; 43 num2[1] = 0; 44 return ; 45 } 46 else if( n < 100 && n >= 10){ 47 num2[4] = num2[2]; 48 num2[3] = num2[1]; 49 num2[2] = 0; 50 num2[1] = 0; 51 return ; 52 } 53 else if( n < 10){ 54 num2[4] = num2[1]; 55 num2[1] = num2[2] = num2[3] = 0; 56 return ; 57 } 58 } 59 int main(){ 60 int a, b, c, d; 61 int a1, b1, c1, d1; 62 int flag; 63 while(EOF != scanf("%d",&n)){ 64 if(n == -1) break; 65 printf("N=%d:\n",n); 66 if(!init()){ 67 printf("No!!\n"); 68 continue; 69 } 70 flag = 0; 71 deal(); 72 while(1){ 73 ++flag; 74 num1[0] = num1[4] + num1[3] * 10 + num1[2] * 100 + num1[1] * 1000; 75 num2[0] = num2[4] + num2[3] * 10 + num2[2] * 100 + num2[1] * 1000; 76 n = num2[0] - num1[0]; 77 if(n == 0 || n == 6174){ 78 printf("%d-%d=",num2[0],num1[0]); 79 printf("%d\n",n); 80 printf("Ok!! %d times\n",flag); 81 break; 82 } 83 if(flag > 1000){ printf("No!!\n"); break;} 84 printf("%d-%d=",num2[0],num1[0]); 85 printf("%d\n",n); 86 deal(); 87 } 88 } 89 return 0; 90 }
5.3.1 6174问题
时间: 2024-10-12 07:00:04