C语言 ,如何快速统计A到B中的所有包含9 的数字? (A和B可能是很大很大的数, A<B)
答案:4 悬赏:80 手机版
解决时间 2021-03-27 13:47
- 提问者网友:骑士
- 2021-03-26 21:56
C语言 ,如何快速统计A到B中的所有包含9 的数字? (A和B可能是很大很大的数, A<B)
最佳答案
- 五星知识达人网友:街头电车
- 2021-03-26 22:25
A到B是连续的?
最快的方法不是每个数都判断
而是从最高位开始,直接列出带9的数字
比如如果是1111 - 9999
那么首先9xxx的数字
对于剩下的 x9xx的数字,最高位为9的不在其中
然后是xx9x的数字
最后是xxx9的数字
类似于排列组合的方式
每位判断肯定会很慢 无数的模除运算会占用大量的时间
个人之见 仅供参考追问能有流程图或者伪代码么?追答计算A的位数da
计算B的位数db
对于对于从da到db间的每个位数,做处理
循环输出每位为9个数字
对da和db的情况,判断是否小于A或者大于B 其他的直接输出
结束
整个过程可以不用整数类型,而直接用字符串方式读取A和B并直接输出字符串
这样取da db及输出的时候都可以简单得多
输出数字的时候可以用函数嵌套
最快的方法不是每个数都判断
而是从最高位开始,直接列出带9的数字
比如如果是1111 - 9999
那么首先9xxx的数字
对于剩下的 x9xx的数字,最高位为9的不在其中
然后是xx9x的数字
最后是xxx9的数字
类似于排列组合的方式
每位判断肯定会很慢 无数的模除运算会占用大量的时间
个人之见 仅供参考追问能有流程图或者伪代码么?追答计算A的位数da
计算B的位数db
对于对于从da到db间的每个位数,做处理
循环输出每位为9个数字
对da和db的情况,判断是否小于A或者大于B 其他的直接输出
结束
整个过程可以不用整数类型,而直接用字符串方式读取A和B并直接输出字符串
这样取da db及输出的时候都可以简单得多
输出数字的时候可以用函数嵌套
全部回答
- 1楼网友:未来江山和你
- 2021-03-27 01:40
这个应该是一个数学问题吧,比如0-10之间有1个,0-100之间有多少个,0-1000之间有多少个,找出规律,然后用程序去实现,如果直接用atoi去判断的话,时间太长了~
- 2楼网友:低音帝王
- 2021-03-27 01:27
long a=0l;
long b=0l;
char strtemp[20];
char nine[]="9";
scanf(" %Ld %Ld",&a,&b);
printf(" 检查%Ld到%Ld含有9的数字",a,b);
for(long i=a;i{
itoa(i,strtemp,10);
if(strstr(strtemp,nine))
printf("%d ",i);
}追问这道题会有很大很大的数据。。取值范围在 0 - 10^10000 之间。。
long b=0l;
char strtemp[20];
char nine[]="9";
scanf(" %Ld %Ld",&a,&b);
printf(" 检查%Ld到%Ld含有9的数字",a,b);
for(long i=a;i{
itoa(i,strtemp,10);
if(strstr(strtemp,nine))
printf("%d ",i);
}追问这道题会有很大很大的数据。。取值范围在 0 - 10^10000 之间。。
- 3楼网友:神鬼未生
- 2021-03-26 23:48
容易推导1到10^n包含数字9的个数的递推公式f[n]=9*f[n-1]+10^(n-1),因为首位为9,则后面的n-1位任意,共有10^(n-1) ,而首位是0到8这9种情况,则回到1到10^(n-1)这种包含数字9的情况,所以是f[n-1],
设1到a之间一共包含数字9有s[1]个,假定a有n位数,a为a1a2...ama(m+1)..a(n),考察最后一位,如果是9,就是1个,不是9,则是0个,最后两位a(n-1)a(n),例如37,则首位为(0,1,2)的时候,就退化为1-10之间包含9的个数,总共有3*f[1],而s[n]表示最后一位数,他包含数字9的个数,
则s[n-1]=a(n-1)*f[1]+s[n];
同理s[n-2]=a(n-2)*f[2]+s[n-1];
...
逐步递推,就是
for(i=n-1;i>=1;i--)s[i]=a[i]*f[n-i]+s[i+1]; 其中f[n]=9*f[n-1]+10^(n-1);a[i]表示a的第i位数字
求出s[1]就是所求,当然还要注意高精度加法和减法
设1到a之间一共包含数字9有s[1]个,假定a有n位数,a为a1a2...ama(m+1)..a(n),考察最后一位,如果是9,就是1个,不是9,则是0个,最后两位a(n-1)a(n),例如37,则首位为(0,1,2)的时候,就退化为1-10之间包含9的个数,总共有3*f[1],而s[n]表示最后一位数,他包含数字9的个数,
则s[n-1]=a(n-1)*f[1]+s[n];
同理s[n-2]=a(n-2)*f[2]+s[n-1];
...
逐步递推,就是
for(i=n-1;i>=1;i--)s[i]=a[i]*f[n-i]+s[i+1]; 其中f[n]=9*f[n-1]+10^(n-1);a[i]表示a的第i位数字
求出s[1]就是所求,当然还要注意高精度加法和减法
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯