统计数字问题——计算机算法设计与分析

统计数字问题

代码是用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%10switch的表达式,k的值未改变;
switch执行完之后再让k/=10同时m(位数)也减一;这样来依次将数字k中所出现的0-9数字统计起来;

可能讲的不是很详细,如果想详细了解,请直接理解代码。如有疑问,请写在评论区;

猜你喜欢

转载自blog.csdn.net/IWFKU/article/details/114976284