我的代码查找所有数字对,使得 x^y > y^x 产生错误的输出

My code to find all pairs of numbers such that x^y > y^x producing the wrong output

问题是:给定两个长度为 mn 的正整数数组,找到所有 (x, y) 对,使得 x^y > y^x。 (左操作数的右次方)

我遵循了以下逻辑:

  1. if x = 1 则没有有序对满足条件。

  2. 如果y = 1x != 1,条件满足所有x.

  3. 对于 y > x.

    的所有剩余情况,条件为真
  4. 例外情况:(2, 3), (2, 4) and (3, 2)

我的代码是:

    int main(){
        int n, m;
        cin >> m >> n;
        int a[m], b[n];
        for(int i = 0; i < m; i++) cin >> a[i];
        for(int i = 0; i < n; i++) cin >> b[i];
        int count = 0;
        for(int i = 0; i < m; i++){
            if(a[i] != 1){  
                for(int j = 0; j < n; j++){
                    if(b[j] == 1) count++;
                    else if(a[i] == 2 && b[j] >= 5) count++;
                    else if(a[i] == 3 &&(b[j] == 2 || b[j] >=4)) count++;
                    else if(b[j] > a[i]) count++;
                }
            }
        }
        cout << count << endl;
    }

对于某些大输出(在 geeksforgeeks 上),代码输出的值比正确答案多 1。 (例如,12575 而不是 12574 的预期输出,错误为 1)

我无法弄清楚代码在哪里出错。感谢您的帮助!

您使用的数组大小有误:

    int a[n], b[m];                          // a[n], b[m]
    for(int i = 0; i < m; i++) cin >> a[i];  // a[m]
    for(int i = 0; i < n; i++) cin >> b[i];  // b[n]

这意味着如果数组大小不同,您将有未定义的行为。

您可能还在以错误的顺序读取数组大小:

cin >> m >> n;

使用标准 C++17(无 VLA:s)更容易找到问题的建议更改:

#include <cstddef>
#include <iostream>
#include <vector>

int main() {
    if(size_t n, m; std::cin >> n >> m) {
        std::vector<unsigned> a(n);
        std::vector<unsigned> b(m);

        for(auto& v : a) std::cin >> v;
        for(auto& v : b) std::cin >> v;

        int count = 0;
        for(auto aval : a) {
            if(aval != 1) {
                for(auto bval : b) {
                    if(bval == 1)
                        count++;
                    else if(aval == 2 && bval >= 5)
                        count++;
                    else if(aval == 3 && (bval == 2 || bval >= 4))
                        count++;
                    else if(bval > aval)
                        count++;
                }
            }
        }
        std::cout << count << '\n';
    }
}

您正在计算 (2, 4)(2, 3),因为这些情况最终都处于最后一个条件。

将它们视为异常的最简单方法是确保一次处理所有“2 个案例”:

if (a[i] == 2) 
    if (b[j] >= 5) 
         count++;

if (a[i] == 2) 
    count += b[j] >= 5;

当您的代码应该针对某些情况进行例外处理时,请务必测试这些例外情况。