算法题:求0~num所有数中的1的总个数

本文介绍了一种计算从0到指定数值内所有数字中出现的1的总数的方法。通过分解数值并分析每一位上1可能出现的情况,设计了一个递归算法来解决这一问题,并给出了C语言的具体实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


算法题:
写一个函数int fun(int num);,给出一个num的正整数,函数求0到num中所有数的1的个数和:
例:num =  12 ,则0,1,2,3,4,5,6,7,8,9,10,11,12数中1的个数为5.
最后,利用int fun(int num)算出1111111110的1的个数。

以下是我的解法,仅供参考:

****************************************************

实例分析:  0 ~534103的1的总个数
个位上为3,个位上1的个数: 53410+1个  
十位上为0,十位上1的个数:5341*10个
百位上为1,百位上1的个数:534*100个+03+1个
千位上为4,千位上1的个数:53*1000个+1000个
万位上为3,万位上1的个数:5*10000个+10000个
十万位上为5,十万位上1的个数:0*100000个+100000个

算法思路:
设一个数为(X[n-1]...X[2]X[1]X[0])的n位数
0位上的1个数计算:
  当X[0]=0时,为(X[n]...X[3]X[2]X[1])/10^1
  当X[0]=1时,为(X[n]...X[3]X[2]X[1])/10^1 + 1
  当X[0]>1时,为(X[n]...X[3]X[2]X[1])/10^1 + 1
2位上的1个数计算:
  当X[1]=0时,为(X[n]...X[3]X[2]X[1])/10^2*10^1
  当X[1]=1时,为(X[n]...X[3]X[2]X[1])/10^2*10^1+(X[n]...X[3]X[2]X[1])%10^1+1
  当X[1]>1时,为(X[n]...X[3]X[2]X[1])/10^2*10^1+10^1
3位上的1个数计算:
  当X[2]=0时,为(X[n]...X[3]X[2]X[1])/10^3*10^2
  当X[2]=1时,为(X[n]...X[3]X[2]X[1])/10^3*10^2+(X[n]...X[3]X[2]X[1])%10^2+1
  当X[2]>1时,为(X[n]...X[3]X[2]X[1])/10^3*10^2+10^2
...
n-1位上的1个数计算:
  当X[n-1]=0时,为(X[n]...X[3]X[2]X[1])/10^n*10^n-1
  当X[n-1]=1时,为(X[n]...X[3]X[2]X[1])/10^n*10^n-1+(X[n]...X[3]X[2]X[1])%10^(n-1)+1
  当X[n-1]>1时,为(X[n]...X[3]X[2]X[1])/10^n*10^n-1+10^(n-1)

C语言实现:
int fun(int num)
{
int k=0;              
int sum =0;

int pw_k0  = (int)pow(10,k);    //pw_k0值为 10^k
int pw_k1 = (int)pow(10,k+1);   //pw_k1值为 10^(k+1)

while((num-pw_k0)>=0)    //如果num<10^k,说明第k位上没有值可取,即出。
{
  int x= (num%pw_k1-num%pw_k0)/pw_k0; //取第k位上的数,
  if (0 == x)
  {
     sum = sum + num/pw_k1*pw_k0; //当k位上的数是0时,所有数在这个位上的1的个数
  } 
  else if(1 == x)
  {
    sum =sum + num/pw_k1*pw_k0 + num%pw_k0 + 1;  //当k位上的数=1时,所有数在这个位上的1的个数
  }
  else
  {
    sum =sum + num/pw_k1*pw_k0 + pw_k0 ;  //当k位上的数>1时,所有数在这个位上的1的个数
  }
  k++;
  pw_k0  = (int)pow(10,k);
  pw_k1 = (int)pow(10,k+1);
}
return sum;
}

-----------------------------------------

<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值