统计0-9数字问题

nandizhu 2009-03-26 04:03:26
输入一个正整数n,统计1-n中 0-9数字出现的次数

比如

n=15

0:1
1:4
2:2
3:2
4:2
5:2
6:1
7:1
8:1
9:1
...全文
694 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
yezeguo 2009-04-05
  • 打赏
  • 举报
回复
这个直接算就可以了啊
xiguagege 2009-04-05
  • 打赏
  • 举报
回复
参看5楼的
liusichen_0 2009-03-31
  • 打赏
  • 举报
回复
关注一下
梦无痕123 2009-03-31
  • 打赏
  • 举报
回复
继续期待分析
grellen 2009-03-29
  • 打赏
  • 举报
回复
mark
绿色夹克衫 2009-03-28
  • 打赏
  • 举报
回复
每个数2位,共100个,所以总共是200位.其中存在0在第一位的情况,因此计算0的时候需要减去这样的情况。

[Quote=引用 6 楼 nandizhu 的回复:]
引用 5 楼 litaoye 的回复:
看了一下那个帖子里的递归,也是一种比较简单的思路吧,不过应该有更好的方法。

如果算上0的话,以10的幂来看,0-9的数字是完全均匀分布的。比如0-9,每个都是出现了1次
0-99,把所有1位数都看作是0开头的,那么共200位,均匀分布的话每个是20次,
0-999的话,1位数看作00开头,2位数看作0开头,总共3*1000 = 3000每个300次,
以此类推,反过来,只要求一下总的位数,就能反推出0的个数,比如…
[/Quote]
baihacker 2009-03-28
  • 打赏
  • 举报
回复

//这是统计0的.
//因为首零的原因,所以零和其它的有不同
//其它数字自己参考
typedef long long UINT;
UINT CntZeros(UINT n)
{
UINT result = 0;
UINT base = 1;
UINT lower = 0;
UINT higher = 0;
UINT curr = 0;
while (n / base)
{
curr = n / base % 10;
lower = n%base;
higher = n / base / 10;
if (curr > 0) result += higher* base;
else result += (higher - 1) * base + lower + 1;
base *= 10;
}
return result;
}
Felven 2009-03-28
  • 打赏
  • 举报
回复
数字的统计
时间限制:1000 ms 内存限制:8192 KB
总提交:358 (209 users) 正确提交:228 (203 users)
描述

读入一串数字,以句号结束,请统计其中'0'到'9'的各个数字的个数。
输入

一串以句号结束的数字。
输出

照样例输出的格式输出各个数字出现的次数,以逗号(,)隔开。
样例输入
3721123450.
样例输出
0:1,1:2,2:2,3:2,4:1,5:1,7:1

#include<stdio.h>
main()
{
int a[11];
char b[1000];
int i,j,m;
for(i=0;i<=9;i++)
a[i]=100;
scanf("%s",b);
for(j=0;b[j]!='.';j++)
{
if(b[j]=='0')
a[0]++;
if(b[j]=='1')
a[1]++;
if(b[j]=='2')
a[2]++;
if(b[j]=='3')
a[3]++;
if(b[j]=='4')
a[4]++;
if(b[j]=='5')
a[5]++;
if(b[j]=='6')
a[6]++;
if(b[j]=='7')
a[7]++;
if(b[j]=='8')
a[8]++;
if(b[j]=='9')
a[9]++;


}
for(i=9;i>=0;i--)
if(a[i]>100)
{m=i;
break;
}
for(i=0;i<m;i++)
if(a[i]>100)
printf("%d:%d,",i,a[i]-100);
printf("%d:%d",m,a[m]-100);

}
nandizhu 2009-03-27
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 litaoye 的回复:]
看了一下那个帖子里的递归,也是一种比较简单的思路吧,不过应该有更好的方法。

如果算上0的话,以10的幂来看,0-9的数字是完全均匀分布的。比如0-9,每个都是出现了1次
0-99,把所有1位数都看作是0开头的,那么共200位,均匀分布的话每个是20次,
0-999的话,1位数看作00开头,2位数看作0开头,总共3*1000 = 3000每个300次,
以此类推,反过来,只要求一下总的位数,就能反推出0的个数,比如0-999的话,
补了3个0的1次…
[/Quote]

0-99怎么会是200位呢???

应该是00-99 有100种组合,每个数字出现次数相同,每个数字就应该是出现10次,然后再减去以个位出现的时候多算的0的次数

对吧????
绿色夹克衫 2009-03-27
  • 打赏
  • 举报
回复
看了一下那个帖子里的递归,也是一种比较简单的思路吧,不过应该有更好的方法。

如果算上0的话,以10的幂来看,0-9的数字是完全均匀分布的。比如0-9,每个都是出现了1次
0-99,把所有1位数都看作是0开头的,那么共200位,均匀分布的话每个是20次,
0-999的话,1位数看作00开头,2位数看作0开头,总共3*1000 = 3000每个300次,
以此类推,反过来,只要求一下总的位数,就能反推出0的个数,比如0-999的话,
补了3个0的1次,2个0的9次,1个0的90次,所以共补了3+18+90=111次,所以0共有300-111个
(其实4位数时是1111,很有规律的,(10^n - 1) / 9)

有了上面的数据作基础,求具体的某个数的话,就很简单了。
mabailin 2009-03-26
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 dlyme 的回复:]
这个之前讨论过很多次了:
http://topic.csdn.net/u/20071101/23/03C40ABB-CC82-450C-8781-FC121E616BA6.html
[/Quote]

看这个
iamu_87 2009-03-26
  • 打赏
  • 举报
回复
#include<stdio.h>
void main()
{
int iNum = 0;
int iResult[10];
int iLoop = 0;
int iLoop2 = 0;
int iTemp = 0;
scanf("%d", &iNum);
memset(iResult,0,sizeof(iResult));
if(iNum <= 0 )
{
printf("error");
}
for(iLoop = 1; iLoop <= iNum; iLoop++)
{
iTemp = iLoop;
while(iTemp != 0)
{
for(iLoop2 = 0; iLoop2 < 10; iLoop2++)
{
if(iLoop2 == iTemp % 10)
{
iResult[iLoop2]++;
break;
}
}
iTemp = iTemp / 10;
}
}
for(iLoop = 0; iLoop < 10; iLoop++)
{
printf("%5d:%5d\n",iLoop,iResult[iLoop]);
}
return ;
}
lanmuhenhen 2009-03-26
  • 打赏
  • 举报
回复
题目说的不是太清楚吧,是光算个位还是???
  • 打赏
  • 举报
回复

33,010

社区成员

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

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