这题还是比较简单的,就是这个思路一定要理清楚了,唯一一个卡点就是—交换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;
}