"
无奈没在洛谷刷过题,只能从水题做起……
"
【传送门:http://www.luogu.org/problem/show?pid=1980】
<!———————————下面是原题—————————————————————————————-->
- 题目提供者
- 标签 模拟 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 出现的次数。
输入输出样例
11 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