gpt4 book ai didi

c - 为什么我不能将函数返回值分配给矩阵元素?

转载 作者:行者123 更新时间:2023-11-30 19:03:15 24 4
gpt4 key购买 nike

好的,所以我需要输入一个包含 n 个元素的矩阵,并将每个合数替换为最接近的素数。我制作了用于读取矩阵、显示矩阵、查找数字是否为素数以及查找最接近数字的素数的函数,并且它们可以工作。

这是我所做的,问题是替换不起作用,并且出现错误:进程终止,状态为 -1073741510(0 分钟,18 秒)

#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 不同,因为在检查 1 时程序将返回 0 code> 是素数,它需要返回 1,因为 1 实际上是一个素数。

感谢您的所有提示!

最佳答案

我想我可能在您的代码中发现了问题。问题出在你的nearPrime函数上。它适用于作为参数接受的大多数数字,但如果您为此函数输入数字 1,则情况并非如此。考虑一下如果它确实接受数字 1 会发生什么。

然后,你的变量 lp = (1 - 1) = 0。当你进一步将其输入到 prime 函数中时,由于其实现方式,它不会返回 1。然后,如果没有找到素数,则继续减少该数字,并且由于该数字现在为负数,因此它永远不会进入 prime 函数的 for 循环,并且 prime 函数将始终返回 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(当然,不返回矩阵)。

关于c - 为什么我不能将函数返回值分配给矩阵元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54290154/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com