C++ 中满足 m + sum(m) + sum(sum(m)) = N 的数字计数


给定一个数字 N 作为输入。目标是找到满足以下条件的,不超过 N 的数字 m。这里 N<=109

m + sum(m) + sum ( sum (m) ) = N。其中 sum(m) 是 m 的各位数字之和。

如果 m 是 137,则 sum(m)=1+3+7=11 且 sum(sum(m))= sum(11)= 1+1=2

让我们通过示例来理解。

例如

输入 - N=27

输出 - 满足 m + sum(m) + sum(sum(m)) = N 的数字数量为:3

解释 - 这些数字是

9 ( 9 + 9 + 9 = 27 )

15 ( 15 + (1+5) + (6) = 27 )

21 ( 21 + (2+1) + (3) = 27 )

输入 - N=81

输出 - 满足 m + sum(m) + sum(sum(m)) = N 的数字数量为:2

解释 - 这些数字是

63 ( 63 + (6+3) + 9 = 81 )

66 ( 66 + (6+6) + (1+2) = 81 )

下面程序中使用的方案如下

在这种方案中,我们将计算数字的各位数字之和,并将相加的和与 N 进行比较。如果计算出的和等于 N,则递增计数。最后返回计数作为结果。

由于最大数字可能是 109,则 m 的各位数字的最大和可以是 81(9*9),而 sum(sum(m)) 的下一个最大各位数字之和可以是 16(79 的 7+9)。因此,我们将检查从 N-97 到 N 的数字,因为小于 N-97 和大于 N 的整数将不满足给定条件。

  • 以整数 N 作为输入。
  • 函数 total(int num) 获取一个数字 total 并返回其各位数字之和。
  • 将 res_total 作为各位数字之和,将 res 作为当前余数。两者都初始化为 0。
  • 使用 while 循环遍历每个个位数字。
  • 将个位数字作为 res=num % 10 并添加到 res_total 中。
  • 将 num 减少 10 以获取下一个数字。
  • 最后返回 res_total 作为 num 的各位数字之和。
  • 函数 condition(int N) 获取 N 并返回满足 m + sum(m) + sum(sum(m)) 的数字计数。
  • 将初始计数设置为 0。
  • 使用 for 循环从 i=N-97 遍历到 i<=N。
  • 计算各位数字之和,即 temp_1=total(i)。
  • 计算 total(i) 的各位数字之和,即 total(temp_1)。
  • 设置 temp_3 = i + temp_1 + temp_2。如果它等于 N,则递增计数。
  • 在 for 循环结束时,返回计数作为结果。

示例

在线演示

#include <bits/stdc++.h>
using namespace std;
int total(int num) {
   int res_total = 0;
   int res = 0;
   while (num > 0) {
      res = num % 10;
      res_total = res_total + res;
      num = num / 10;
   }
   return res_total;
}
int condition(int N) {
   int count = 0;
   for (int i = N - 97; i <= N; i++) {
      int temp_1 = total(i);
      int temp_2 = total(temp_1);
      int temp_3 = i + temp_1 + temp_2;
      if (temp_3 == N) {
         count++;
      }
   }
   return count;
}
int main() {
   int N = 9999;
   cout << "Count of numbers satisfying m + sum(m) + sum(sum(m)) = N are: " << condition(N);
   return 0;
}

如果我们运行以上代码,它将生成以下输出:

输出

Count of numbers satisfying m + sum(m) + sum(sum(m)) = N are: 2

更新于: 2021年1月29日

146 次查看

开启您的 职业生涯

通过完成课程获得认证

开始学习
广告