P1980【洛谷】 计数问题 解题报告

  "

          无奈没在洛谷刷过题,只能从水题做起……

                                                                                                       "

【传送门:http://www.luogu.org/problem/show?pid=1980】

<!———————————下面是原题—————————————————————————————-->

P1980 计数问题

  • 题目提供者lyx613
  • 标签 模拟 2013 NOIp普及组
  • 难度 入门难度

 题目描述

试计算在区间 1 到 n 的所有整数中,数字 x(0 ≤ x ≤ 9)共出现了多少次?例如,在 1

到 11 中,即在 1、2、3、4、5、6、7、8、9、10、11 中,数字 1 出现了 4 次。

输入输出格式

输入格式:

输入文件名为 count.in。

输入共 1 行,包含 2 个整数 n、x,之间用一个空格隔开。

输出格式:

输出文件名为 count.out。

输出共 1 行,包含一个整数,表示 x 出现的次数。

输入输出样例

输入样例#1:
11 1
输出样例#1:
4

说明

对于 100%的数据,1≤ n ≤ 1,000,000,0 ≤ x ≤ 9。
<!———————————————解题过程—————————————————————————-->

LZ刚开始的想法

//这是LZ刚开始的代码只拿了30分【错误代码】--------------------------------------------
program WA; var
  n,x,data,i:integer;
  temp,ans:string;
  t1:char;
begin
  read(n,x);//读入数据
  for i:= 1 to n do
    begin
      str(i,temp);//将每个数转为字符串
      ans:=ans+temp;//将转换得到的字符串加到ans里
    end;
  t1:=chr(x+48);//用字符表示数字X
  for i:= 1 to length(ans) do
    if ans[i]=t1 then inc(data);//一个个对比,若找到就递增data
  writeln(data);
end.
//-----------------------------------------------------------------------------------------

  这个想法有个缺陷,就是如果n太大导致ans这个字符串太长就会超出string的范围,或许可以用ansistring,但是直接一个数一个数的分析不是更好吗,而且还能降低不必要的时间和空间上的浪费。

  于是就有了下面这个题解……

//下面是正确代码-----------------------------------------------------------------------
program accepted;
var
  n,x,i,j,ans:longint;
  temp:string;
begin
  readln(n,x);
  for i:=1 to n do
  begin
    str(i,temp);//转换为字符串方便计算
    for j:=1 to length(temp)do//一位一位比较
      if ord(temp[j])-48 =x//求每一位的ascII码,-48变数字,
        then inc(ans);//出现一次加一次
  end;
  writeln(ans);//输出出现次数
end. //---------------------------------------------------------------------------------------

  艰难的AC了道水题——(*/ω\*)

 -----------------------------------------------------------------------------------------------------------

本文作者的博客园:http://www.cnblogs.com/tonylim/


本文作者的CSDN博客:http://blog.csdn.net/happy_china1312

原文地址:https://www.cnblogs.com/bobble/p/5710941.html