/* 问题一:求1到N之间出现的"1"的个数 */
/* 解法一 遍历求1-N中每一个含有"1"个数 */
unsigned long int count_1_interger(unsigned long int n)
{
unsigned long int num = 0;
while (n != 0)
{
num += (1 == n % 10) ? 1 : 0;
n /= 10;
}
return num;
}
unsigned long int f(unsigned long int n)
{
unsigned long int icount = 0;
for (i = 1; i < n; i++)
{
icount += count_1_interger(i);
}
return icount;
}
/* 解法二 f(N) = 个位数1个数+十位数1个数+百位数1个数....*/
/* 百位数1个数(12013) = 若百位是0,更高位数(12)乘以当前位数(100); */
/* 若百位是1(12113),更高位数(12)乘以当前位数(100) + 低位数字(13)+1*/
/* 若百位是其他,(更高位数+1)乘以当前位数 */
int sum1s(int n)
{
int count = 0;
int factor = 1;
int lownum = 0;
int currnum = 0;
int highnum = 0;
while (n / factor != 0)
{
lownum = n - (n / factor) * factor;
currnum = (n / factor) % 10;
highnum = n / (factor * 10);
switch (currnum)
{
case 0:
count += highnum * factor;
break;
case 1:
count += highnum * factor + lownum + 1;
break;
default:
count += (highnum + 1) * factor;
break;
}
factor *= 10;
}
return count;
}
编程之美 2.4 1的数目
最新推荐文章于 2023-12-12 17:03:06 发布