zoukankan      html  css  js  c++  java
  • 5.3.1 6174问题

    假设你有一个各位数字互不相同的四位数,把所有数字从大到小排序后得到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);
    66         if(!init()){
    67             printf("No!!
    ");
    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);
    80                 printf("Ok!! %d times
    ",flag);
    81                 break;
    82             }
    83             if(flag > 1000){ printf("No!!
    "); break;}
    84             printf("%d-%d=",num2[0],num1[0]);
    85             printf("%d
    ",n);
    86             deal();
    87         }
    88     }
    89     return 0;
    90 }
  • 相关阅读:
    spring jdk动态代理
    java分页对象封装
    jQuery---ajxa
    创建ajax对象
    EL基础语法
    jsp语法
    servlet cookie session
    java 单例模式
    yapi 强大的api管理系统
    Orange--一个基于OpenResty / Nginx的HTTP API Gateway
  • 原文地址:https://www.cnblogs.com/wushuaiyi/p/3815201.html
Copyright © 2011-2022 走看看