我的代码查找所有数字对,使得 x^y > y^x 产生错误的输出
My code to find all pairs of numbers such that x^y > y^x producing the wrong output
问题是:给定两个长度为 m
和 n
的正整数数组,找到所有 (x, y)
对,使得 x^y > y^x
。 (左操作数的右次方)
我遵循了以下逻辑:
if x = 1
则没有有序对满足条件。
如果y = 1
和x != 1
,条件满足所有x
.
对于 y > x
.
的所有剩余情况,条件为真
例外情况:(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;
当您的代码应该针对某些情况进行例外处理时,请务必测试这些例外情况。
问题是:给定两个长度为 m
和 n
的正整数数组,找到所有 (x, y)
对,使得 x^y > y^x
。 (左操作数的右次方)
我遵循了以下逻辑:
if
x = 1
则没有有序对满足条件。如果
y = 1
和x != 1
,条件满足所有x
.对于
的所有剩余情况,条件为真y > x
.例外情况:
(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;
当您的代码应该针对某些情况进行例外处理时,请务必测试这些例外情况。