- 题目
任意给定一个正整数N,计算出1到N的所有1的和.
比如:N=11;符合的数有:1,10,11.所有一的和=4;N=21,所有1的和为13;
- 思路
1)对于0~8999而言,划分为0***,2***,……,8***,故共有C(999)*8个1;以及1***,共C(999)+999个1;所以,一共有C(999)*9+999个1
2)对于9000~9527而言,共有C(527)个1
综上所述:
C(9527) = C(999)*9 + C(527) + 999
对于a1a2a3...an而言
C(a1a2a3...an) = C(999)*a1 + C(a2a3...an) + C(10^n-1)
- 算法
#include
<
iostream
>
#include < cmath >
using namespace std;
int getDigit( int num);
int count( int num);
int main( void )
... {
while (true)
...{
cout << "Input a number : ";
int num;
cin >> num;
cout << "There are " << count(num) << " '1' from 0 to " << num << endl;
}
return 0;
}
int getDigit( int num)
... {
if (num < 10)
...{
return 1;
}
else
...{
return getDigit(num/10) + 1;
}
}
int count( int num)
... {
int ret = 0;
if (num < 10)
...{
ret = num >= 1 ? 1 : 0;
}
else
...{
int digit = getDigit(num);
int num1 = pow(10, digit-1);
int head = num / num1;
if (head > 1) // num is 9527
...{
ret = count(num1 - 1)*head // 0 ~ 8999 except 1000 ~ 1999
+ count(num % num1) // 9000 ~ 9527
+ num1; // first digit of 1000 ~ 1999
}
else // num is 1527
...{
ret = count(num1 - 1) // 0 ~ 999
+ count(num % num1) // last 3 digit of 1000 ~ 1527
+ num % num1 + 1; // first digit of 1000 ~ 1527
}
}
return ret;
}
#include < cmath >
using namespace std;
int getDigit( int num);
int count( int num);
int main( void )
... {
while (true)
...{
cout << "Input a number : ";
int num;
cin >> num;
cout << "There are " << count(num) << " '1' from 0 to " << num << endl;
}
return 0;
}
int getDigit( int num)
... {
if (num < 10)
...{
return 1;
}
else
...{
return getDigit(num/10) + 1;
}
}
int count( int num)
... {
int ret = 0;
if (num < 10)
...{
ret = num >= 1 ? 1 : 0;
}
else
...{
int digit = getDigit(num);
int num1 = pow(10, digit-1);
int head = num / num1;
if (head > 1) // num is 9527
...{
ret = count(num1 - 1)*head // 0 ~ 8999 except 1000 ~ 1999
+ count(num % num1) // 9000 ~ 9527
+ num1; // first digit of 1000 ~ 1999
}
else // num is 1527
...{
ret = count(num1 - 1) // 0 ~ 999
+ count(num % num1) // last 3 digit of 1000 ~ 1527
+ num % num1 + 1; // first digit of 1000 ~ 1527
}
}
return ret;
}