算法题:
写一个函数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>