求两个数之间所有的数,每个数字(0~9)出现的次数算法!

来源:百度知道 编辑:UC知道 时间:2024/07/04 15:22:36
给出2个数,a和b,求a到b之间所有的数,每个数字(0~9)各出现了多少次,
例如 1到10之间有1、2、3、4、5、6、7、8、9、10
其中1出现了2次,其余的各出现了1次,

1到12之间有1、2、3、4、5、6、7、8、9、10、11、12
其中1出现4次,2出现1次,其余出现1次。

a、b的范围为1~100000000,
求一种算法,可以在1秒之内算出来的,所以跟穷举有关的算法都不行
(计算机算~ 不是人算,不需要把程序给我,只告诉我怎么算就行~ 我自己编)
回2L~ 看清楚范围,0-100000000,数组你能定义多大?而且会飞长慢~!

 
 
 
如果你把 0 到 b 之间的所有数字叠在一起,底端是 0,而且所有位数不及 b 的数字都用足够的前导零填补,即不论 b 多大都形成一个四方数字矩阵。你会发现:
1)当 b 只含有 9 的时候(9、99、999、。。。),0 到 b 之间所有数字出现的次数的总和是一样的。
2)最大位数的出现次数跟最大位数后面的数值有直接的关系。

以上这两点是下面的 C++ 程序的基本计算概念。程序里有相当详细的注释。countOccurrence() 是主角函数。main() 里有对 countOccurrence() 的完整测试(以枚举的计算结果核对;范围是 1..100000000,所以大约要 10 分钟才能完成测试)。

#include <iostream>
#include <cmath>

using namespace std;

int max(int a, int b) {
    return a < b ? b : a;
}

// 返回参数得数量级(参数为个位数则返回 0,参数为十位数则返回 1,、、、)
int getOrder(int i) {
    return (int) log10(max(1, i));
}

// 返回十的 pow 次幂
int tenToThePowerOf(int pow) {
    int result = 1;
    while (pow-- > 0)
        result *= 10;
    return result;
}

// 计算 0

输入两个数,输出这两个数之间所有不能被7整除的数。 C语言:接受两个数,找出这两个数之间所有奇数的和. 输入两个数,输出这两个数之间所有不能被7整除的数。(找错误) 一个2位数之和是9,每个数字加2,得到的数是原来的2倍少5,求着两个数。 编写程序,求1~1000之间所有满足各位数字的立方和等于它本身的数。 求所有这样的数,个位比十位大,数字交换后,新数原数之和为130到140之间 两个立方体用0-9的数字填每个面一个数,可重复添要求能用拼图出一个月的所有天数 C语言问题(接受两个数x和y。找出这两个数之间所有奇数的和) 已知两个1~30之间的数字,甲知道两数之和,乙知道两数之积。 一个两位数,十位数字是个位数字的2倍,将两个数对调后,得到的两位数比原来的数小36,求这两个数