<pre name="code" class="cpp">#include <iostream>
#include <cstdio>
using namespace std;
const int maxn = 9 + 5;
long long num[maxn];
long long sum, temp, k, start;
int n, cnt;
int main()
{
num[0] = 9; //一位数的个数9
for(int i = 1; i <= 9; i ++)
num[i] = num[i - 1] * 10; //i位数的个数9 90 900 9000....
for(int i = 1; i <= 9; i ++)
num[i] *= i + 1; //i位数中数字字符(0~9)的个数
while(~scanf("%d", & n))
{
sum = 0, cnt = 0, k = 10; //sum计算数字字符数 cnt计算n的位数
while(n != temp) //当n == temp 即 被除数n小于除数k 跳出
{
temp = n % k; //temp是余数
k *= 10; //k不断10倍变大
cnt ++; //cnt记录
}
for(int i = 0; i < cnt - 1; i ++)
sum += num[i]; //计算cnt位前的数字字符数
start = 1;
for(int i = 1; i < cnt; i ++)
start *= 10; //start表示cnt位最小数
sum += (n - start + 1) * cnt; //计算cnt位到n的数字字符数
printf("%I64d\n", sum);
}
return 0;
}
题意:输入n(1 <= n <= 10^9)。从1 写到 n 总共要写多少个数字。
题解:写的有点乱。还有就是早应该一开始全用long long 可以省去很多错误。