1145. 简单游戏(easygame)

本文介绍了一个简单的算法问题——计算从1到n所有整数中数字1出现的总次数。通过寻找规律并使用Pascal编程语言实现,提供了一种有效的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1145. 简单游戏(easygame) 

题目描述

一天,小R准备找小h去游泳,当他找到小h时,发现小h正在痛苦地写着一列数,123…n,于是就问小h痛苦的原因,小h告诉他,现在他要算1..n这些数里面,1出现的次数是多少,如n=11的时候,有1,10,11共出现41,现在给出n,你能快速给出答案么?

输入

一行,就是n,(1<=n<=maxlongint)

输出

一个整数,表示1..n1出现的次数。

样例输入
11
样例输出
4

思路:

这题找规律,代码如下:

var
  s,s1,s2:string;
  i,x,x1,n,j:longint;
  ans:int64;
begin
  assign(input,'easygame.in');reset(input);
  assign(output,'easygame.out');rewrite(output);
  readln(s);
  s:='0'+s;
  for i:=length(s) downto 2 do
    begin
      n:=1;
      if (i<>length(s)) then
        begin
          s1:=copy(s,1,i-1);
          s2:=copy(s,i+1,length(s)-i+1);
          for j:=1 to length(s)-i do
            n:=n*10;
          val(s1,x);
          val(s2,x1);
          x:=x+1;
          if (s[i]='0')
            then begin x1:=0;dec(x);end;
          if (s[i]='1')
            then ans:=ans+x*n-(n-x1-1)
            else ans:=ans+x*n;
        end;
      if i=length(s) then
         begin
           s1:=copy(s,1,length(s)-1);
           val(s1,x);
           ans:=ans+x+1;
           if s[i]='0' then dec(ans);
         end;
    end;
  writeln(ans);
  close(input);close(output);
end.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值