用 C++ 统计从 1 到 N 的数字中所有数字的总数
给定一个数字 N 作为输入。目标是计算从 1 到 N 之间的所有数字的总位数。1 到 9 的数字每个需要 1 位数字,11 到 99 的数字每个需要 2 位数字,100 到 999 的数字每个需要 3 位数字,依此类推。
让我们用例子来理解
输入 − N=11
输出 − 从 1 到 N 的数字的总位数为:13
解释 − 数字 1 到 9 每个有 1 位数字:9 位数字 10、11 每个有 2 位数字。4 位数字。总位数 = 9 + 4 = 13。
输入 − N=999
输出 − 从 1 到 N 的数字的总位数为:2889
解释 − 数字 1 到 9 每个有 1 位数字:9 位数字 10 到 99 每个有 2 位数字:180 位数字。100 到 999 每个有 3 位数字:2700 位数字 总位数 = 2700 + 180 + 9 = 2889 位数字
下面程序中使用的方案如下
我们将使用两种方案。第一种是使用递归函数计算数字 num 中的位数的朴素方案。将传递的 num 转换为字符串。字符串的长度就是 num 中的位数。对每个数字都这样做,通过当前 num-1 递归地传递。
将数字作为正整数。
函数 total_digits(int num) 获取 num 并返回 1 到 num 之间数字的位数。
要计算 num 中的位数,请将 num 转换为字符串。(to_string(num))。
字符串的长度就是 num 中的位数。
如果 num 为 1,则返回 1。否则,返回长度 + total_digits(num-1) 以获取小于 num 的其余数字。
最后我们将得到总位数作为结果。
高效方案
在这种方案中,我们将使用以下逻辑:对于每个直到 N 的数字。我们将遍历 10、100、1000 直到 N。对于每个 10i,数字的位数为 (num-i + 1)。
将数字作为正整数。
函数 total_digits(int num) 获取 num 并返回 1 到 num 之间数字的位数。
最初将总数设为 0。
遍历 i=1 到 i<=num,每次迭代中 i 增加 10,并将 num-i+1 添加到计数中。
在 for 循环结束时返回计数作为结果。
示例(朴素方案)
#include <bits/stdc++.h> using namespace std; int total_digits(int num){ string str = to_string(num); int length = str.length(); if (num == 1){ return 1; } return length + total_digits(num - 1); } int main(){ int num = 20; cout<<"Count of total number of digits from 1 to n are: "<<total_digits(num); return 0; }
输出
如果我们运行以上代码,它将生成以下输出:
Count of total number of digits from 1 to n are: 31
示例(高效方案)
#include <bits/stdc++.h> using namespace std; int total_digits(int num){ int count = 0; for(int i = 1; i <= num; i *= 10){ count = count + (num - i + 1); } return count; } int main(){ int num = 20; cout<<"Count of total number of digits from 1 to n are: "<<total_digits(num); return 0; }
输出
如果我们运行以上代码,它将生成以下输出:
Count of total number of digits from 1 to n are: 31