P1980 [NOIP2013 普及组] 计数问题(c++)
题目描述
试计算在区间 1 到 n 的所有整数中,数字 x(0<=x<=9)共出现了多少次?例如,在 1 到 11 中,即在 1,2,3,4,5,6,7,8,9,10,11 中,数字 1 出现了 4次。
输入格式
2 个整数 n,x,之间用一个空格隔开。
输出格式
1 个整数,表示 x 出现的次数。
输入样例
11 1
输出样例
4
题目里数据范围较小,如果数据范围扩大的话,暴力会卡掉
复杂度O(log10 N)
思路:
个位为x,
十位为x,
百位为x,
…
eg:
n=897,x=4;
个位为4:每10个数有1个4,89×1+1
十位为4:每100个数有10个4,8×10+10
百位为4:每1000个数有100个4,0×100+100
eg:
n=123,x=4
个位为4:每10个数有1个4,12×1+0
十位为4:每100个数有10个4,1×10+0
百位为4:每1000个数有100个4,0×100+0
eg:
n=444,x=4
个位为4:每10个数有1个4,44×1+1
十位为4:每100个数有10个4,4×10+5
百位为4:每1000个数有100个4,0×1000+45
eg:
若x=0,这个和别的情况略微不同,但是也很好想…可以自己想一下…
个位为0:每10个数有1个0;
最高位一定不为0;
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int man=1e2;
int a[man];
int main()
{
int n,x;
cin>>n>>x;
ll sum=0;
int t=n;
int id=0;
while(t)
{
a[id]=t%10;
t/=10;
id++;
}
t=n;
if(x)
{
int e=0;
for(int i=0;i<id;i++)
{
ll p=pow(10,e);
t/=10;
sum+=t*p;
if(a[i]>x) sum+=p;
else if(a[i]==x) sum+=n%p+1;
e++;
}
cout<<sum;
}
else
{
t/=10;
sum+=t;
int e=1;
for(int i=1;i<id-1;i++)
{
ll p=pow(10,e);
t/=10;
sum+=(t-1)*p;
if(a[i]>x) sum+=p;
else if(a[i]==x) sum+=n%p+1;
e++;
}
cout<<sum;
}
return 0;
}