原题:
题目背景
NOIP2013 普及组 T1
题目描述
试计算在区间 11 到 nn 的所有整数中,数字 x(0≤x≤9)共出现了多少次?例如,在 1 到 11 中,即在 1,2,3,4,5,6,7,8,9,10,11中,数字 1 出现了 4次。
输入格式
2 个整数 n,x,之间用一个空格隔开。
输出格式
1 个整数,表示 x 出现的次数。
输入输出样例
输入 #1复制
11 1输出 #1复制
4说明/提示
对于 100% 的数据,1≤n≤,0≤x≤9。
这道题也是卡了我一段时间。从1到n每个数都判断一遍显然是容易超时的,因此采用了根据n直接计算每位x出现的次数。
将n分为3份,a是当前讨论的位数前面的数,b是正在讨论的那位数,c是当前位数后的数。
由于需要讨论的数从1开始,且0不可以作为数的开头,因此x=0的情况需要单独讨论。
设当前讨论的位数的权为q。
当x0时:
- b>x,此时x出现在这一位的次数为(a+1)*q
- b=x,此时x出现在这一位的次数为a*q+c+1(与上一种情况区别在于当a与n相同时,x在b这一位出现的次数只有c+1次)
- b<x,此时x出现在这一位的次数为a*q
当x=0时:
- b0,此时0出现在这一位的次数为a*q(b=0时,a不能等于0)
- b=0,此时0出现在这一位的次数为(a-1)*q+c+1(当b前为a时,0出现的次数由c+1决定)
AC代码:
#include<iostream>
using namespace std;
int main()
{
int n,x;
cin>>n>>x;
int a=0,b=0,c=0,q=1,sum=0;
for(int i=0;i<=6;i++)
{
a=n/10;
b=n%10;
if(!a&&!b)
break;
if(x)
{
if(b>x)
sum+=(a+1)*q;
else if(b==x)
sum+=a*q+c+1;
else
sum+=a*q;
}
else
{
if(b)
sum+=a*q;
else
sum+=(a-1)*q+c+1;
}
c+=b*q;
q*=10;
n=a;
}
cout<<sum<<endl;
}
在刚开始思考这个方法时,我以为需要分很多种情况,结果处处是漏洞,将分类简化之后反而过了,学会删繁就简还是很有必要的。