数字三元组(数字方格)

题目来自《算法基础与在线实践》

非常简单的一道题,但一开始不知道一些符号的优先级导致程序一直错误

题目链接数字三元组(数字方格)

一种简单的方法就是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;
}

最后需要注意的是,!的优先级要高于双目运算符的

猜你喜欢

转载自blog.csdn.net/qq_40980884/article/details/83212721