C++实现数组素数等统计功能提交Codeforces测试点5报错求解
问题分析与修复方案
核心错误点
- 头文件缺失:代码中使用了
INT_MIN、INT_MAX常量,但未引入<climits>头文件,部分编译器会触发未定义行为。 prime函数逻辑错误:判断arr[i]是否为素数时,错误使用数组长度n作为循环判断的上限,和判断素数的逻辑完全不符。比如测试用例中的素数5,当循环变量j增加到5时,会触发5%5==0的判断,直接将5误判为非素数,导致素数统计结果出错。- 隐性逻辑风险:
prime函数中的flag变量没有在每次处理新元素前重置,虽然当前逻辑不会触发错误,但存在残留状态影响结果的风险。
修正后的完整代码
#include <iostream> #include <math.h> #include <climits> using namespace std; int maximum(int arr[], int n) { int max = INT_MIN; for (int i = 0; i < n; i++) { if (max < arr[i]) { max = arr[i]; } } return max; } int minimum(int arr[], int n) { int min = INT_MAX; for (int i = 0; i < n; i++) { if (min > arr[i]) { min = arr[i]; } } return min; } int prime(int arr[], int n) { int con = 0; for (int i = 0; i < n; i++) { bool flag = true; if (arr[i] <= 1) continue; if (arr[i] == 2) { con++; continue; } if (arr[i] % 2 == 0) continue; for (int j = 3; j <= sqrt(arr[i]); j += 2) { if (arr[i] % j == 0) { flag = false; break; } } if (flag == true) con++; } return con; } int palindrome(int arr[], int n) { int i = 0, con = 0; while (n--) { int temp; temp = arr[i]; int reverseNumber = 0, rightDigit; while (temp != 0) { rightDigit = temp % 10; reverseNumber = (reverseNumber * 10) + rightDigit; temp = temp / 10; } if (reverseNumber == arr[i]) { con++; } i++; } return con; } int divisors(int arr[], int n) { int max = 0; int con = 0; int x = arr[0]; for (int i = 0; i < n; i++) { con = 0; for (int j = 1; j <= sqrt(arr[i]); j++) { if (arr[i] % j == 0) { con++; if (j != arr[i]/j) con++; } } if (max < con) { max = con; x = arr[i]; } else if (max == con) { if (x < arr[i]) { x = arr[i]; } } } return x; } int main() { int n; cin >> n; int arr[1001]; for (int i = 0; i < n; i++) cin >> arr[i]; cout << "The maximum number : " << maximum(arr, n) << endl; cout << "The minimum number : " << minimum(arr, n) << endl; cout << "The number of prime numbers : " << prime(arr, n) << endl; cout << "The number of palindrome numbers : " << palindrome(arr, n) << endl; cout << "The number that has the maximum number of divisors : " << divisors(arr, n) << endl; return 0; }
优化说明
- 修正了素数判断的循环上限逻辑,同时加入了偶数跳过的优化,执行效率更高
- 优化了约数统计的逻辑,循环上限改为
sqrt(arr[i]),时间复杂度从O(n)降到O(√n) - 补全了缺失的头文件,消除了未定义行为风险
内容的提问来源于stack exchange,提问作者Mostafa Mohamed Taha
相关产品推荐
相关产品推荐

