每日一题---数的分解

在这里插入图片描述
这题还是比较简单的,就是这个思路一定要理清楚了,唯一一个卡点就是—交换3个整数的顺序被视为同一种方法,于是呢,我们的思路就是—让i < j < k, 然后判断i, j, k是否含2和4就行了。
下面是我的代码:

#include<bits/stdc++.h>
using namespace std;

bool is(int k){
	if(k%10==2||k/10%10==2||k/100%10==2||k/1000==2||k%10==4||k/10%10==4||k/100%10==4||k/1000==4){
			   return false;
	}else{
		return true;
	}	   
}

int main(){
	int cnt=0;
	for(int i=1;i<2019/3;i++){
		if(is(i)){
			for(int j=i+1;j<2019-i-j;j++){
				if(is(j)&&is(2019-i-j)){
					//cout<<i<<" "<<j<<" "<<2019-i-j<<endl;
					cnt++;
				}
			}
		}
	}
	cout<<cnt<<endl;
    return 0;
}

我这里调用了一个函数,使整个代码更简洁了点,需要注意的是if(k%10==2||k/10%10==2||k/100%10==2||k/1000==2||k%10==4||k/10%10==4||k/100%10==4||k/1000==4)这里表面看起来k%10==2和直接k==2,好像没啥子区别,但实际不是这样的,比如12这个数,如果是k==2,那么k/10后就是1,于是这个数就被错误保留了,如果k%10==2,那么12%10==2就会被剔除。后来由于这个原因,我把代码优化了一下,如下:

#include<bits/stdc++.h>
using namespace std;
bool isOK(int x) {
    for (; x > 0; x /= 10)
        if (x % 10 == 2 || x % 10 == 4) return false;
    return true;
}
int main() {
    int N = 2019;
    int cnt = 0;
    for (int i = 1; i < N / 3; ++i)
        if (isOK(i))
            //k = N - i - j > j
            for (int j = i + 1; N - i - j > j; ++j)
                if (isOK(j) && isOK(N - i - j)) ++cnt;
    cout<<cnt<<endl;
    return 0;
}
发布了131 篇原创文章 · 获赞 58 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_43595030/article/details/104941800