#P2601. 幸运数字(不是用AI做的)

这道题主要就是拆数

题目说数据在10510^5以内,所以抗跌住O(n2)O(n^2)的摧残。

拆数就是将一个数的每一位拆下来:

用 %10 取最后一位,存储或输出

再用10 删最后一位(移除最后一位)

代码:

//拆数
int z,i=1,a[10001];//z为要拆掉数,a数组存储拆完的数,i计位
while(z!=0){ //直到0结束
	a[i]=z%10; //用 %10 取最后一位,存储
	z/=10;  //用10 删最后一位(移除最后一位)
	i++;   //位数++
}i--;    //最后一位没有数i--

然后再判断数位上有没有3就行了。

完整代码如下(注释是我自己写的):

#include<bits/stdc++.h>
using namespace std;
int n,m,cnt=0;
int f(int x){
	//拆数 基本上用传统的while拆数就行了 
	int z=x,i=1,a[10001];//因为 (0≤n≤m≤10^5)所以数组要开大一点
	while(z!=0){
		a[i]=z%10;
		z/=10;
		i++;
	}i--;
	
	//记录数位上3的个数
	int c=0;
	for(int k = 1;k <= i;k++)if(a[k] == 3)c++;
	return c;
}
int main(){
	cin >> n >> m;
	for(int i = n;i <= m;i++){
		cnt+=f(i);
	}
	cout << cnt;
	return 0;
}