详细问题见此地址:https://blog.csdn.net/weixin_45972337/article/details/106473968
请各位指导。
哇,看了眼代码,我觉得主要的问题是不规范,语法有问题,建议换个编译器试试。问题注释在代码里。
int main(){
int nc, np;
scanf("%d", &nc);
long long A[nc], B[np]; // 这里的np未赋值,就开数组,应该开不出来的
for(int i = 0; i < nc; i++){
scanf("%lld", &A[i]);
}
scanf("%d", &np);
for(int i = 0; i < np; i++){
scanf("%lld", &B[i]);
}
sort(A, A+nc, cmp2);
sort(B, B+np, cmp2);
long long ans = 0;
// for(int i = 0; i < nc; i++){
// printf("%lld:%lld ",A[i], B[i]);
// }
for(int i = 0; B[i] >0 && A[i] > 0; i++){ // 我没看题,这里没考虑数组越界
ans += A[i] * B[i];
}
for(int i = min(nc, np)-1; B[i] < 0 && A[i] < 0; i--){ // 这里也没考虑数组越界
ans += A[i] * B[i];
}
printf("输出结果:");
printf("*%lld*", ans);
return 0;
}
首先把程序写规范,想开np、nc的大小的数组建议还是用vector的resize,这种开定长数组不是所有编译器能通过的比如vs。
你原本的代码写得就有问题 静态数组的创建size的大小一定是要确定好的 要不你就用malloc动态申请一个 然后再用malloc扩增
代码如下:
#include
#include
#include
using namespace std;
bool cmp2(long long a, long long b){
return a > b;
}
int main(){
int nc, np;
scanf("%d", &nc);
long long A[nc]; //如果在这把B申明,但数组大小不确定就会报错
for(int i = 0; i < nc; i++){
scanf("%lld", &A[i]);
}
scanf("%d", &np);
long long B[np];
for(int i = 0; i < np; i++){
scanf("%lld", &B[i]);
}
sort(A, A+nc, cmp2);
sort(B, B+np, cmp2);
long long ans = 0;
for(int i = 0; i < nc; i++){
printf("%lld:%lld ",A[i], B[i]);
}
for(int i = 0; B[i] >0 && A[i] > 0; i++){
ans += A[i] * B[i];
}
for(int i = min(nc, np)-1; B[i] < 0 && A[i] < 0; i--){
ans += A[i] * B[i];
}
printf("输出结果:");
printf("*%lld*", ans);
return 0;
}
解答:改成上述之后,就不会出现你说的问题
你那个问题发生的原因可能是,你的编译器对我之前说的问题没有报错,这个错误本身是存在的,后面的现象就是这个问题的并发症 也就是内存溢出读到了其他的内存快里面 而刚刚好那个地方有数据 所以能得出一个结果
正常情况下 就直接报错了 不会运行的 建议重装编译器 用正规的软件。
debug一下就知道哪里不同了