目录
B.计数问题
思路:
代码:
时间复杂度:
总结:
题目链接:
B.计数问题
时间:1s
空间:128M
题目描述:
计算在区间 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出现的次数。
样例输入1:
11 1
样例输出1:
4
约定:
1<=n<=1000000,0<=x<=9。
思路:
首先,写一个函数find:
参数是两个int类型的n和x;
其作用就是求n这个数的各位数字包含着几个x;
我们刚开始,要求n的各位数字,可以用一个while循环:
直到n为0为止
每次将n除以10的余数存入一个变量里面,然后判断这个变量是不是等于x,是的话就将一个计数器++;
main中:
输入之后,for循环从1开始,依次到n,每一次都要进行一次find(i,x)的计数
最后输出这个计数器.
代码:
//B.计数问题(信友队100题挑战赛)
//正解:
#include <bits/stdc++.h>
using namespace std;
int ans=0,n,x;
void find(int n,int x){ //找n的各位数字中有几个x
int tmp; //用来存储n的各位数字
while(n!=0){ //循环取数字
tmp=n%10; //除以10的余数
if(tmp==x) //只要两者相等
ans++; //计数器++
n/=10;
}
}
int main(){
cin>>n>>x; //输入
for(int i=1;i<=n;i++) //循环找x
find(i,x); //依次运用函数
cout<<ans<<endl; //输出计数器
return 0;
}
时间复杂度:
时间复杂度是O(6n)=O(n)*O(6)
那么这个O(6)是怎么来的呢?
O(6):这个6复杂度就是find函数运行依次最大的时间,因为n最多是10^6,除以6次10,你就为0了,while就结束了!
总结:
这道题考察了学生们对于函数的调用,数字的各位数处理的灵活应用,总的来说还是不算难的,适合刚学算法的人做.
题目链接:
https://www.xinyoudui.com/contest?courses=336&books=325&pages=8575&fragments=16340&problemId=7810&pattern=0https://www.xinyoudui.com/contest?courses=336&books=325&pages=8575&fragments=16340&problemId=7810&pattern=0