1. 示例程序:
int count_of_1(unsigned int n)
{
/* 参数检查 */
if (0 == n)
{
return 0;
}
/* 计算1到n中1出现的次数 */
int count = 0; // 总个数
unsigned int factor = 1; // 因子
unsigned int lower_num = 0; // 后缀数
unsigned int curr_num = 0; // factor位数字,个位数字、十位数字、百位数字等
unsigned int higher_num = 0; // 前缀数
/* 依次循环求各位上出现1的次数 */
while (n / factor != 0)
{
lower_num = n % factor; // 求后缀数
curr_num = (n / factor) % 10; // 求factor位数字
higher_num = n / (factor * 10); // 求前缀数
switch (curr_num)
{
case 0:
/* factor位为0,此位出现1的个数为前缀数乘以因子 */
count += higher_num * factor;
break;
case 1:
/* factor位为1,此位出现1的个数为前缀数乘以因子,再加上后缀数加1 */
count += higher_num * factor + lower_num + 1;
break;
default:
/* factor位大于1,此位出现1的个数为前缀数加1后乘以因子 */
count += (higher_num + 1) * factor;
break;
}
/* 因子依次为:1, 10, 100, 1000, 10000, ... */
factor *= 10;
} // end of while
return count;
} // end
2. 注解:
factor:因子,比如1、10、100、1000等;
lower_num:后缀数;
curr_num:factor位数字,比如:个位数字、十位数字、百位数字等;
higher_num:前缀数;
举例:12345
对于factor=100,则curr_num为3,lower_num为45,higher_num为12;