数字三元组(数字方格)
题目来自《算法基础与在线实践》
非常简单的一道题,但一开始不知道一些符号的优先级导致程序一直错误
题目链接数字三元组(数字方格)
一种简单的方法就是a1,a2,a3三个数字都从0到n依次遍历一遍,最后找到和的最大值
#include <iostream>
using namespace std;
int main()
{
int n;
int max=0;
cin>>n;
int a1,a2,a3;
for(a1=0;a1<=n;++a1){
for(a2=0;a2<=n;++a2){
if((a1+a2)%2)
continue;
for(a3=0;a3<=n;++a3){
if((a2+a3)%3)
continue;
if(!((a1+a2+a3)%5)&&(a1+a2+a3)>max)
// !的优先级比%高,所以判断a1 a2 a3之和为0要加括号
max=a1+a2+a3;
}
}
}
cout<<max;
return 0;
}
另一种方法
- a1从0到n遍历
- 因为a1+a2为2的倍数,所以,a1 a2同为奇数或偶数
- a2+a3=3t,a3=3t-a2,且a3>0,即t>a2/3,寻找a3即可用一个计数器t从a2/3每次加1,直到a3>n为止
#include <iostream>
using namespace std;
int main()
{
int n,max=0;
int a1,a2,a3;
cin>>n;
for(int i=0;i<=n;++i){
a1=i;
if(a1%2){ //a1为奇数,a2也为奇数
for(int j=1;j<=n;j+=2){
a2=j;
for(int t=a2/3;;++t){
a3=3*t-a2;
if(a3>n)
break;
if(a3>=0){
int m=a1+a2+a3;
if(!(m%5)&&m>max)
max=m;
}
}
}
}
else //a1为偶数
for(int j=0;j<=n;j+=2){
a2=j;
for(int t=a2/3;;++t){
a3=3*t-a2;
if(a3>n)
break;
if(a3>=0){
int m=a1+a2+a3;
if(!(m%5)&&m>max)
// !的优先级高于%
max=m;
}
}
}
}
cout<<max;
return 0;
}
最后需要注意的是,!的优先级要高于双目运算符的