将2-4000中的所有素数分别输出到两个文件中,一个是文本文件,另一个是二进制文件;读出文件中的内容输出(每行10列)。
#include <stdio.h>
#include <stdbool.h>
#define MAX_NUM 4000
// 判断一个数是否为素数
bool is_prime(int num)
{
if (num < 2)
return false;
for (int i = 2; i * i <= num; i++)
{
if (num % i == 0)
return false;
}
return true;
}
// 将素数写入文本文件和二进制文件
void write_primes()
{
FILE *txt_fp = fopen("primes.txt", "w");
FILE *bin_fp = fopen("primes.bin", "wb");
if (txt_fp == NULL || bin_fp == NULL)
{
printf("打开文件失败\n");
return;
}
for (int i = 2; i <= MAX_NUM; i++)
{
if (is_prime(i))
{
// 写入文本文件
fprintf(txt_fp, "%d ", i);
// 写入二进制文件
fwrite(&i, sizeof(int), 1, bin_fp);
}
}
fclose(txt_fp);
fclose(bin_fp);
}
// 从文件中读取素数并输出
void read_primes()
{
FILE *txt_fp = fopen("primes.txt", "r");
FILE *bin_fp = fopen("primes.bin", "rb");
if (txt_fp == NULL || bin_fp == NULL)
{
printf("打开文件失败\n");
return;
}
// 从文本文件中读取素数并输出
printf("\n从text文件读取:\n");
int count = 0;
int num;
while (fscanf(txt_fp, "%d", &num) != EOF)
{
printf("%-8d", num);
count++;
if (count % 10 == 0)
printf("\n");
}
printf("\n");
// 从二进制文件中读取素数并输出
printf("\n从二进制文件读取:\n");
count = 0;
while (fread(&num, sizeof(int), 1, bin_fp) > 0)
{
printf("%-8d", num);
count++;
if (count % 10 == 0)
printf("\n");
}
printf("\n");
fclose(txt_fp);
fclose(bin_fp);
}
int main()
{
write_primes();
read_primes();
return 0;
}
不知道你这个问题是否已经解决, 如果还没有解决的话:正确代码:
#include <stdio.h>
int fun(char s[],int n)
{
int i;
if((i=n/10)!=0)
fun(s+1,i);
*s=n%10+'0';
return 0;
}
int main()
{
int num;
char str[10]=" ";
printf("input integer data:");
scanf("%d",&num);
fun(str,num);
printf("output string:\n");
puts(str);
return 0;
}
思路分析:
(1)设计函数实现数据的逆序存放,设定形参数组接收实参数组的地址,来存储数据的每一位。
(2)函数体采用递归的方式解决问题,因此考虑递归进行的条件。例如,把数据 n 存放到数组 s 中,若 n 是一位数,则存放 n 到数组中;若 n 不是一位数,则存放 n/10 到数组中。
(3)问题解决的难点在于找到数据的存放地址,通过不断地取余和整除 10 来得到数据的每一位。为了实现数据的逆序存放,每一次整除 10 的时候,同时把存放数据的数组地址后移,这样得到的第一位数存放在数组的最后一位……通过依次前移,即递归的回归,实现整个数据的存放。通过函数 fun() 实现字符串中的数字的逆序转换。
我可以解决这个问题。
首先,需要编写一个函数来判断一个数字是否为素数。这可以通过循环判断该数字是否能被小于它的所有数字整除来实现。
def is_prime(num):
if num < 2:
return False
for i in range(2, num):
if num % i == 0:
return False
return True
接下来,我们可以使用该函数来找出所有范围内的素数,并将它们分别存储到文本文件和二进制文件中。在此过程中,我们可以使用Python内置的open
函数来打开文件,并使用write
方法将素数写入文件中。
import struct
lower_bound = 2
upper_bound = 4000
prime_nums = [num for num in range(lower_bound, upper_bound+1) if is_prime(num)]
with open('prime_nums.txt', 'w') as f:
for i, prime in enumerate(prime_nums):
f.write(str(prime) + ' ')
if (i+1) % 10 == 0:
f.write('\n')
with open('prime_nums.bin', 'wb') as f:
for prime in prime_nums:
f.write(struct.pack('i', prime))
最后,我们可以编写一个函数来读取文件中的素数,并以每行10列的格式输出它们的值。
def print_primes(file):
with open(file, 'r') as f:
primes = f.read().split()
for i in range(0, len(primes), 10):
print(' '.join(primes[i:i+10]))
print_primes('prime_nums.txt')
print_primes('prime_nums.bin')
在运行程序时,需要用户输入数字范围的下界和上界。
lower_bound = int(input("请输入数字范围的下界: "))
upper_bound = int(input("请输入数字范围的上界: "))
完整的代码如下。
import struct
def is_prime(num):
if num < 2:
return False
for i in range(2, num):
if num % i == 0:
return False
return True
def print_primes(file):
with open(file, 'r') as f:
primes = f.read().split()
for i in range(0, len(primes), 10):
print(' '.join(primes[i:i+10]))
lower_bound = int(input("请输入数字范围的下界: "))
upper_bound = int(input("请输入数字范围的上界: "))
prime_nums = [num for num in range(lower_bound, upper_bound+1) if is_prime(num)]
with open('prime_nums.txt', 'w') as f:
for i, prime in enumerate(prime_nums):
f.write(str(prime) + ' ')
if (i+1) % 10 == 0:
f.write('\n')
with open('prime_nums.bin', 'wb') as f:
for prime in prime_nums:
f.write(struct.pack('i', prime))
print("Text file:")
print_primes('prime_nums.txt')
print("Binary file:")
print_primes('prime_nums.bin')