1019 数字黑洞 (20 分)(C++)

简介: 给定任一个各位数字不完全相同的 4 位正整数,如果我们先把 4 个数字按非递增排序,再按非递减排序,然后用第 1 个数字减第 2 个数字,将得到一个新的数字。一直重复这样做,我们很快会停在有“数字黑洞”之称的 6174,这个神奇的数字也叫 Kaprekar 常数。

给定任一个各位数字不完全相同的 4 位正整数,如果我们先把 4 个数字按非递增排序,再按非递减排序,然后用第 1 个数字减第 2 个数字,将得到一个新的数字。一直重复这样做,我们很快会停在有“数字黑洞”之称的 6174,这个神奇的数字也叫 Kaprekar 常数。

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

1. 7766 - 6677 = 1089
2. 9810 - 0189 = 9621
3. 9621 - 1269 = 8352
4. 8532 - 2358 = 6174
5. 7641 - 1467 = 6174
6. ... ...

现给定任意 4 位正整数,请编写程序演示到达黑洞的过程。

输入格式:

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

输出格式:

如果 N 的 4 位数字全相等,则在一行内输出 N - N = 0000;否则将计算的每一步在一行内输出,直到 6174 作为差出现,输出格式见样例。注意每个数字按 4 位数格式输出。

输入样例 1:

6767

输出样例 1:

1. 7766 - 6677 = 1089
2. 9810 - 0189 = 9621
3. 9621 - 1269 = 8352
4. 8532 - 2358 = 6174

输入样例 2:

2222

输出样例 2:

2222 - 2222 = 0000

题目分析:

1.需要反转函数,取值函数,存数组函数

2.做出三大函数后,检查连贯性

我做了两次,测试点二错了:

e4cf0737411641a982412bc792506bc9.png


第一次代码如下:


#include <iostream>
#include <algorithm>
using namespace std;
void fan(int a[4], int b[4]) { //反转函数
  for (int i = 0, j = 3; i < 4; i++, j--) {
    a[i] = b[j];
  }
}
int getsorce(int x[4]) { //取值函数
  int t = 0;
  for (int i = 0; i < 4; i++) {
    t = t * 10 + x[i];
  }
  return t;
}
void in(int x[4], int n) { //存数组函数
  for (int i = 0; i < 4; i++) {
    x[i] = n % 10;
    n /= 10;
  }
}
int main() {
  int n;
  cin >> n;
  int arr[4], brr[4], a, b, c;
  in(brr, n);
  sort(brr, brr + 4);
  fan(arr, brr);
  a = getsorce(arr);
  b = getsorce(brr);
  if (a == b) {
    cout << a << " - " << b << " = 0000";
  } else {
    c = a - b;
    while (c != 6174) {
      printf("%04d - %04d = %4d\n", a, b, c);
      in(brr, c);
      sort(brr, brr + 4);
      fan(arr, brr);
      a = getsorce(arr);
      b = getsorce(brr);
      c = a - b;
    }
    printf("%04d - %04d = %d", a, b, c);
  }
}


改进后代码如下:


0484d3dc4636473b9a6b63d561e55b74.png

#include <iostream>
#include <algorithm>
using namespace std;
void fan(int a[4], int b[4]) { //反转函数
  for (int i = 0, j = 3; i < 4; i++, j--) {
    a[i] = b[j];
  }
}
int getsorce(int x[4]) { //取值函数
  int t = 0;
  for (int i = 0; i < 4; i++) {
    t = t * 10 + x[i];
  }
  return t;
}
void in(int x[4], int n) { //存数组函数
  for (int i = 0; i < 4; i++) {
    x[i] = n % 10;
    n /= 10;
  }
}
int main() {
  int n;
  cin >> n;
  int arr[4], brr[4], a, b, c;
  in(brr, n);
  sort(brr, brr + 4);
  fan(arr, brr);
  a = getsorce(arr);
  b = getsorce(brr);
  if (a == b) {
    cout << a << " - " << b << " = 0000";
  } else {
    c = a - b;
    while (c != 6174) {
      printf("%04d - %04d = %04d\n", a, b, c);
      in(brr, c);
      sort(brr, brr + 4);
      fan(arr, brr);
      a = getsorce(arr);
      b = getsorce(brr);
      c = a - b;
    }
    printf("%04d - %04d = %d", a, b, c);
  }
}

看看:


前:

16e8d14947b24331b0a92ac54b8b5177.png

后:

856b1cb180834994bc9e4b81130014f9.png


所以,测试点二是:

两数相减后,若差值为189,得是0189

相关文章
|
3月前
1044 火星数字 (20 分)
1044 火星数字 (20 分)
|
2月前
【洛谷】P1308 [NOIP2011 普及组] 统计单词数
然后要被查找的b字符串,可能会出现第二个样例中的情况,也就是字符串a是to,而字符串b的Ottoman,这样是不符合题意的。为了 解决这个问题,我们将字符串a首尾都加一个空格,同时将字符串b首尾都加一个空格(这里是为了让字符串b的首单词和尾单词前后均有空格)为了能持续找字符串b中的所有字符串a,我们用一个while循环,如果能找到,就每次从能找到的位置的下一个位置(也就是能找到的位置下标+1)开始找,并及时更新位置,同时计数。因为不区分大小写,所以可以将两个字符串a,b都转为小写(也可以都转为大写)。
66 10
【洛谷】P1308 [NOIP2011 普及组] 统计单词数
|
3月前
1019 数字黑洞
1019 数字黑洞
|
4月前
|
C++
“拨”出数位上的数字 - 多种思路实现反向输出一个四位数(二)
```markdown 编写函数,统计正整数中零的个数和最大数字。例如:1080有2个零,最大数字是8。主函数负责输入正整数。解题思路:通过循环取数,逐位检查,更新零的计数器和最大数字。示例代码使用C++实现,通过传址调用来改变主函数中的值。注意,循环遍历数位体现了对每个数位的处理思想。 ```
53 0
|
4月前
|
缓存 C语言
“拨”出数位上的数字 - 多种思路实现反向输出一个四位数(一)
本文介绍了编程中一个经典的入门题目——反向输出X位数,特别是以反向输出四位数为例,探讨了多种实现方法。这些方法包括使用取模运算分别获取数位、循环取数、利用scanf的宽度控制以及使用数组。每种方法都有其特点,适用于不同的场景。文章旨在帮助初学者拓宽编程思路,并鼓励读者讨论和分享更多实现方式。
97 0
|
4月前
|
网络架构
P1308 [NOIP2011 普及组] 统计单词数(模拟加函数+数学分析)
P1308 [NOIP2011 普及组] 统计单词数(模拟加函数+数学分析)
69 0
|
算法 测试技术
算法强化每日一题--字符串中找出连续最长的数字串
算法强化每日一题--字符串中找出连续最长的数字串
|
算法 索引
Leetcode 40组合总数(回溯)Ⅱ&41缺失的第一个正数&42接雨水
给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
93 0
Leetcode 40组合总数(回溯)Ⅱ&41缺失的第一个正数&42接雨水
|
测试技术
PAT乙级1002写出这个数(20分)
PAT乙级1002写出这个数(20分)
91 0