统计数字问题
代码是用C++实现的
算法设计
给定一个十进制整数 n,计算从1到n的全部数字中分别用到数字0-9的次数
算法分析
先贴代码
#include<iostream>
using namespace std;
int weishu(int n) //计算此时n的位数
{
int m=1;
while(n/10)
{
m++;
n/=10;
}
return m;
}
int main()
{
int num[9]={
0}; //用来计算0-9出现的个数
int n; //输入的数n
int m; //m是n的位数
int i; //用来控制循环
int k; //用来控制switch函数
cin>>n;
m=weishu(n);
while(n>0) //n自减到0之前,从高位往低位依次运算
{
k=n; //把n的值赋给k
while(m)
{
switch(k%10)
{
case 0:num[0]+=1;break;
case 1:num[1]+=1;break;
case 2:num[2]+=1;break;
case 3:num[3]+=1;break;
case 4:num[4]+=1;break;
case 5:num[5]+=1;break;
case 6:num[6]+=1;break;
case 7:num[7]+=1;break;
case 8:num[8]+=1;break;
case 9:num[9]+=1;break;
}
m--;
k/=10;
}
n--;
m=weishu(n);
}
for(i=0;i<=9;i++)
{
cout<<i<<" "<<num[i]<<endl;
}
return 0;
}
可以看到代码中while循环体里面又嵌套了一个while循环:分别令它们为循环体一和循环体二。
这里只说一些比较重要的部分
1.weishu(int n) 函数体是计算出n的位数,把值返回给m;
2.循环体一中k=n
(在循环体二中k的值会改变,k的作用是将n中0-9出现的数字个数传给num[9]数组)
n- -,m=weishu(n);
3.循环体二中k取10的余数,将k的个位统计入num[9]中;注意此时k%10是switch的表达式,k的值未改变;
switch执行完之后再让k/=10同时m(位数)也减一;这样来依次将数字k中所出现的0-9数字统计起来;
可能讲的不是很详细,如果想详细了解,请直接理解代码。如有疑问,请写在评论区;