CodeForces-552B - Vanya and Books

<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 可以省去很多错误。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值