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