关于页码中0~9数字出现的次数

hahayuan09 2007-11-01 11:00:26
我想问一个编程方面的问题
就是求一本书的页码数中0~9这几个数字出现的次数,用递归的方法做,如何做,请各位大侠帮帮忙啊
...全文
1109 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
hahayuan09 2007-11-09
  • 打赏
  • 举报
回复
我将我的方法贴上来啊
#include<iostream.h>
int s[10]; //记录0~9出现的次数
int a[10]; //a[i]记录n位数的规律
void sum(int n,int l,int m)
{
if(m==1)
{
int zero=1;
for(int i=0;i<=l;i++) //去除前缀0
{
s[0]-=zero;
zero*=10;
}
}
if(n<10)
{
for(int i=0;i<=n;i++)
{
s[i]+=1;
}
return;
}//位数为1位时,出现次数加1
//位数大于1时的出现次数
for(int t=1;t<=l;t++)//计算规律f(n)=n*10^(n-1)
{
m=1;
for(i=1;i<t;i++)
m=m*10;
a[t]=t*m;
}
int zero=1;
for(int i=0;i<l;i++)
{
zero*= 10;
} //求出输入数为10的n次方
int yushu=n%zero; //求出最高位以后的数
int zuigao=n/zero; //求出最高位zuigao
for(i=0;i<zuigao;i++)
{
s[i]+=zero;
} //求出0~zuigao-1位的数的出现次数
for(i=0;i<10;i++)
{
s[i]+=zuigao*a[l];
} //求出与余数位数相同的0~zuigao-1位中0~9出现的次数
//如果余数是0,则程序可结束,不为0则补上所缺的0数,和最高位对应所缺的数
if(yushu==0) //补上所缺的0数,并且最高位加1
{
s[zuigao]++;
s[0]+=l;
}
else
{
i=0;
while((zero/=10)>yushu)
{
i++;
}
s[0]+=i*(yushu+1);//补回因作模操作丢失的0
s[zuigao]+=(yushu+1);//补回最高位丢失的数目
sum(yushu,l-i-1,m+1);//处理余位数
}
}
void main()
{
int i,m,n,N,l;
cout<<"输入数字:";
cin>>N;
cout<<'\n';
n = N;
for(i=0;n>=10;i++)
{
n/=10;
} //求出N的位数n-1
l=i;
sum(N,l,1);
for(i=0; i<10;i++)
{
cout<< "数字"<<i<<"出现了:"<<s[i]<<"次"<<'\n';
}
}
hahayuan09 2007-11-08
  • 打赏
  • 举报
回复
问题已经解决了,谢谢各位啊
HW121 2007-11-07
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <stdlib.h>

void statNum(int sn[10], int n)
{
int i, c, k =0, pown=1, s=0;

printf("n = %d\n", n);
for(int i = 0; i < 10; i++)
sn[i] = 0;

while(n > 0)
{
c = n%10;
// 统计从个位算起前k位 0 ~ 9 个数
for(i=0; i < 10; i++)
sn[i] += c*k*pown/10;
// 如果k+1位为0,去掉第k+1位补 0 个数
if(c==0) sn[0] -= pown;
// 统计第k+1位出现 1 ~ (c-1) 个数
for(i=1; i < c; i++)
sn[i] += pown;
// 统计第k+1位出现 c 个数
sn[c] += 1 + s;

s += c*pown;
n /= 10;
pown *= 10;
k++;
}
}


void main(int argc , char *argv[])
{
int sn[10], i, n=2030;
if(argc > 1)
n = atoi(argv[1]);

statNum(sn, n);
for(i=0; i < 10; i++)
printf("%d: %d\n", i,sn[i]);
}
HW121 2007-11-07
  • 打赏
  • 举报
回复
计算0出现个数,先补0,就可以同其他数字同样计算,然后去掉补 0 个数

#include <stdio.h>
#include <stdlib.h>

void statNum(int sn[10], int n)
{
int i, c, k, s, pown;

for(int i = 0; i < 10; i++)
sn[i] = 0;

for(k=s=0, pown=1; n > 0; k++, n /=10, pown *=10)
{
c = n%10;
//先补0
//统计从个位算起前k位 0 ~ 9 个数
for(i=0; i < 10; i++)
sn[i] += c*k*pown/10;
// 统计第k+1位出现 0 ~ (c-1) 个数
for(i=0; i < c; i++)
sn[i] += pown;
// 统计第k+1位出现 c 个数
sn[c] += 1 + s;

// 去掉第k+1位补 0 个数
sn[0] -= pown;

s += c*pown;
}
}


void main(int argc , char *argv[])
{
int sn[10], i, n=2030;
if(argc > 1)
n = atoi(argv[1]);

printf("n = %d\n", n);
statNum(sn, n);
for(i=0; i < 10; i++)
printf("%d: %d\n", i,sn[i]);
}
HW121 2007-11-07
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <stdlib.h>

void statNum(int sn[10], int n)
{
int i, c, k, s, pown;

for(int i = 0; i < 10; i++)
sn[i] = 0;

for(k=s=0, pown=1; n > 0; k++, n /=10, pown *=10)
{
c = n%10;
// 统计从个位算起前k位 0 ~ 9 个数
for(i=0; i < 10; i++)
sn[i] += c*k*pown/10;
// 先补0统计第k+1位出现 0 ~ (c-1) 个数
for(i=0; i < c; i++)
sn[i] += pown;
// 去掉第k+1位补 0 个数
sn[0] -= pown;
// 统计第k+1位出现 c 个数
sn[c] += 1 + s;

s += c*pown;
}
}


void main(int argc , char *argv[])
{
int sn[10], i, n=2030;
if(argc > 1)
n = atoi(argv[1]);

printf("n = %d\n", n);
statNum(sn, n);
for(i=0; i < 10; i++)
printf("%d: %d\n", i,sn[i]);
}

medie2005 2007-11-03
  • 打赏
  • 举报
回复
记T(n,k)为区间[1,n)内的自然数数字组成中含数字k(0<k<10)的次数。
那么,可以得到如下的递归式:
T(n,k)=(n%10)*T(n/10+1,k) + (10-n%10)*T(n/10,k) + n/10 + (n%10>k) (1)
T(n,k)=0 n<=k
T(n,k)=1 k<n<10

特殊的,n=10^t、 k=1 则:
T(10^t,k)=10*T(10^(t-1))+10^(t-1)
于是,得到:T(10^t)=t*10^(t-1)。

注意,(1)式并不适合k=0的情况。
xdspower 2007-11-02
  • 打赏
  • 举报
回复
不过确实递归方法更快
xdspower 2007-11-02
  • 打赏
  • 举报
回复
递归的方法?
为什么要递归?
直接遍历一次啊,很快的吧
只是求次数啊,而且才10个字符类型啊

33,025

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧