好,所以我需要输入n个元素的矩阵,并用最接近的质数替换每个复合数。我编写了一些函数来读取矩阵,显示矩阵,查找数字是否为质数,并找到与数字最接近的质数,然后它们起作用。
这是我所做的,问题是替换无法正常工作,并且出现错误:Process terminated with status -1073741510 (0 minute(s), 18 second(s))
#include <stdio.h>
#include <stdlib.h>
int n;
int readMatrix(int **matrix)
{
for (int i=0; i<n; i++) {
for (int j=0; j<n; j++) {
printf("matrix[%d][%d]=", i, j);
scanf("%d", &matrix[i][j]);
}
}
return matrix;
}
void showMatrix(int **matrix)
{
for (int i=0; i<n; i++) {
for (int j=0; j<n; j++) {
printf("%d ", matrix[i][j]);
}
printf("\n");
}
}
int prime(int a)
{
int c = 0;
for (int i=1; i<a; i++) {
if (a % i == 0) {
c++;
}
}
if (c == 1) {
return 1;
} else return 0;
}
int nearPrime(int b)
{
int lp, bp, ok = 0, p;
lp = b - 1;
bp = b + 1;
while (ok != 1) {
if (prime(lp) == 1) {
ok = 1; break;
}
lp--;
}
ok = 0;
while (ok != 1) {
if (prime(bp) == 1) {
ok = 1; break;
}
bp++;
}
if ((b-lp) < (bp-b)) {
p = lp;
} else p = bp;
return p;
}
int main()
{
int **matrix, aux;
printf("n=");
scanf("%d", &n);
matrix = malloc(n*sizeof(int *));
if (matrix == NULL) exit(1);
for (int i=0; i<n; i++) {
matrix[i] = malloc(n*sizeof(int));
if (matrix[i] == NULL) exit(1);
}
readMatrix(matrix);
showMatrix(matrix);
for (int i=0; i<n; i++) {
for (int j=0; j<n; j++) {
if (prime(matrix[i][j]) == 0 && matrix[i][j] != 1) {
matrix[i][j] = nearPrime(matrix[i][j]);
}
}
}
showMatrix(matrix);
for (int i=0; i<n; i++) free(matrix[i]);
free(matrix);
return 0;
}
您能告诉我为什么它不起作用吗?
更新
我想我解决了。在检查矩阵数是否为质数时,我还添加了一个条件,即它必须与1
不同,因为程序在检查return 0
是否为质数时需要1
,并且需要{ {1}},因为return 1
实际上是质数。
感谢所有提示!
答案 0 :(得分:1)
我想我可能已经在您的代码中找到了问题。问题出在您的nearPrime函数上。它适用于作为参数输入的大多数数字,但是如果您为此函数输入数字1,则不是这种情况。考虑如果数字为1将会发生什么。
然后,您的变量lp =(1-1-1)=0。当您进一步将其输入到prime函数中时,由于其实现方式,它将不会返回1。然后,如果找不到素数,则继续减小该数,并且由于该数现在为负,因此它甚至不会在素数函数的for循环中输入,并且素数函数将始终返回0。因此,您将陷入困境while(ok!= 1)循环了很长时间,这就是您的进程终止的原因。要解决此问题,请确保在进入循环之前检查lp!= 0。由于还要检查最接近的素数,因此还需要在返回值之前检查lp是否为0。简而言之,请对您的代码进行以下更改。
int nearPrime(int b)
{
int lp, bp, ok = 0, p;
lp = b - 1;
bp = b + 1;
if (lp != 0)
{
while (ok != 1) {
if (prime(lp) == 1) {
ok = 1; break;
}
lp--;
}
}
ok = 0;
while (ok != 1) {
if (prime(bp) == 1) {
ok = 1; break;
}
bp++;
}
if (((b - lp) < (bp - b)) && lp != 0) {
p = lp;
}
else p = bp;
return p;
}
另一件事:您的readMatrix函数似乎期望返回int类型,但是您正在返回int **类型的参数矩阵。此外,在您的主代码中,您实际上没有对返回值做任何事情,因此很可能将readMatrix函数的返回类型更改为void(当然,不要返回矩阵)。