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

问题描述

问题是:给定长度为mn的两个正整数数组,找到(x,y)的所有 x^y > y^x对。 (将左侧操作数提高到右侧的幂)

我遵循以下逻辑:

  1. 如果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上),代码输出的值比正确答案大一。 (例如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;

当代码应在某些情况下例外时,请确保测试这些例外情况。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...