问题描述
我非常担心我不了解C编程的基本原理。我正在从文本文件中读取数字,我将检查它们是否为质数。但是,问题在于,从未从IsPrime
函数中调用main
函数。我尝试使number
变量成为全局变量和局部变量,但是它不起作用。我的基本知识是否很糟糕?
从文本文件读取没有问题。看起来像这样:
73771782 81296771 79982326 75332246 10128193
81643413 76259734 94432076 50063976 91748657
42311916 -1920042 90747362 53851612 43498487
73193311 96685173 39019033 8630045 17
由于main
函数从不调用IsPrime
函数,其结果是所有数字都被打印为is a prime number
。
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int isPrime(int number);
int main(int argc,char **argv) {
int number = 0;
int number2 = 0;
FILE *fp = NULL;
char file_name[] = "C:\\Users\\Erlen\\Desktop\\numbers.txt";
fp = fopen(file_name,"r");
if (fp == NULL) {
printf("Error opening the file: \n");
exit(0);
}
fscanf(fp,"%d",&number);
while (number != number2) {
if (isPrime(&number) == 1) {
printf("Number: %d is a prime number \n",number);
} else {
printf("The number %d is a prime number \n",number);
}
number2 = number;
fscanf(fp,&number);
}
printf("\n");
return 0;
}
int isPrime(int number) {
for (int i = 2; i < number; i++) {
if (number % i == 0) {
return 0;
}
}
return 1;
}
解决方法
isPrime(&number)
,您传递变量number
的地址,而不是其值。更改为isPrime(number)
检查scanf的结果。
fscanf(fp,"%d",&number);
=>
if(fscanf(fp,&number) != 1)
{
printf("Scanf error\n");
exit(0);
}
,
您的代码中存在多个问题:
- 您将
number
的地址而不是其值传递给isPrime
。 - 您应该迭代
while (fscanf(fp,&number) == 1)
以处理文件中的所有数字。您当前的循环逻辑很麻烦,如果第一个数字为0
或文件包含相同的连续数字,则会失败。 - 在C语言中习惯仅测试
isPrime
的返回值是否为非零。 - 综合数字消息不正确。
- 对于失败,退出状态的约定不为零。
- 您应该采用负数的绝对值。
- 您应该为
0
和0
返回1
,它们不被视为素数。 - 您可以通过测试用
isPrime
而不是i * i <= number
来提高i < number
的性能,将复杂度降低到 O(sqrt(N))。
这是修改后的版本:
#include <stdio.h>
int isPrime(int number);
int main(int argc,char *argv[]) {
int number;
FILE *fp;
char file_name[] = "C:\\Users\\Erlen\\Desktop\\numbers.txt";
fp = fopen(file_name,"r");
if (fp == NULL) {
printf("Error opening the file: \n");
return 1;
}
while (fscanf(fp,&number) == 1) {
if (isPrime(number)) {
printf("Number %d is a prime number\n",number);
} else {
printf("Number %d is a not a prime number\n",number);
}
}
return 0;
}
int isPrime(int number) {
if (number < 0)
number = -number;
if (number < 2)
return 0;
for (int i = 2; i < number; i++) {
if (number % i == 0) {
return 0;
}
}
return 1;
}