题目:输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。
例如输入12,从1到12这些整数中包含1 的数字有1,10,11和12,1一共出现了5次。
利用动态规划的思想,每次往前进行增加。代码如下:
#include<iostream>
using namespace std;
int Countdatanum(int n)
{
int Data[10] = {0};
int i = 0;
int k = 10;
int length;
int temp;
int sum = 0;
int value = n;
while(value != 0)
{
Data[i] = value % k;
value /= 10;
i++;
}
length = i;
if(Data[0] > 0)
Data[0] = 1;
int pre = 1;
sum += Data[0];
for(i = 1; i < length; i++)
{
if(Data[i] > 1)
{
sum += pre * Data[i] + k;
}
else if(Data[i] == 1)
{
sum += pre * Data[i];
sum += n % k + 1;
}
else
Data[i] = 0;
pre = pre * 10 + k;
k *= 10;
}
return sum;
}
int NumberOf1(unsigned int n)
{
int number = 0;
while(n)
{
if(n % 10 == 1)
number ++;
n = n / 10;
}
return number;
}
int NumberOf1BeforeBetween1AndN_Solution1(unsigned int n)
{
int number = 0;
// Find the number of 1 in each integer between 1 and n
for(unsigned int i = 1; i <= n; ++ i)
number += NumberOf1(i);
return number;
}
int main()
{
cout<<Countdatanum(203)<<endl;
cout<<NumberOf1BeforeBetween1AndN_Solution1(203)<<endl;
return 0;
}
本文介绍了一种使用动态规划方法计算从1到任意整数n的十进制表示中1出现的次数的方法。通过遍历每个数字并使用数组存储各个位上的数字,实现对1出现次数的精确计数。
2万+

被折叠的 条评论
为什么被折叠?



