给定一个[10,100]闭区间范围内的正整数N,编写函数void func(int N, int prime[], int *prime_count, int composite[], int *composite_count);,实现将大于等于2小于等于N的整数按是否为素数分成两类。 要求: (1)输入:N为整数,若输入数据不在题目要求范围内,输出错误提示”Input error! Please input an integer N, 10<=N<=100.\n”,并重新输入。 (2)素数存放在指针prime指向的数组中,指针prime_count指向的位置存放素数个数,合数存放在指针composit指向的数组中,指针composite_count指向的位置存放合数的个数。 (3)输出:共输出四行。第一行输出素数的个数;第二行输出所有的素数,两个数字之间用空格隔开;第三行输出合数的个数;第四行输出所有的合数,两个数字之间用空格隔开。 程序示例1: 10↙ 4 2 3 5 7 5 4 6 8 9 10 程序示例2: 120↙ Input error! Please input an integer N, 10<=N<=100.
解答如下:
首先判断是否素数的函数:
int is_prime(int n) // 定义一个函数is_prime,接受一个整数n作为参数
{
int i; // 定义一个整型变量i,用于循环迭代
if (n == 1 || n == 2) // 如果n等于1或者2
{
return 1; // 返回1,表示n是素数
}
else // 如果n不等于1且不等于2
{
for (i = 2; i <= sqrt(n); i++) // 从2开始循环到i小于等于n的平方根
{
if (n % i == 0) // 如果n能被i整除
break; // 跳出循环,表示n不是素数
}
if (n % i != 0) // 如果n不能被i整除
return 1; // 返回1,表示n是素数
else // 如果n能被i整除
return 0; // 返回0,表示n不是素数
}
}
然后还有输出一维数组值的函数:
void printf_arr1(int arr[], int n) //n为输出多少个元素
{
for (int i = 0; i < n; i++) // 从第0个元素开始,检查i是否小于n,如果小于则执行循环体
{
printf("%d", arr[i]); // 打印当前元素的值
if (i != n - 1) // 如果当前元素不是最后一个元素
printf(","); // 在元素后面打印一个逗号(可根据需要调整)
}
}
共同构成下面的函数:
// 定义一个函数,名为func,它接受五个参数:一个整数N,一个整数数组prime,一个指向整数的指针prime_count(用于存储素数数量),一个整数数组composite,一个指向整数的指针composite_count(用于存储合数数量)
void func(int N, int prime[], int* prime_count, int composite[], int* composite_count)
{
// 初始化两个指针变量j和k,分别用于跟踪prime数组和composite数组的当前位置
int j = 0,k=0;
// 从2开始迭代到N(包括N)
for (int i = 2; i <=N; i++)
{
// 判断i是否为素数。如果是,将其存入prime数组,并增加j的值
if (is_prime(i))//是素数,则存放
{
prime[j] = i;
j++;
}
// 如果i不是素数,那么将其存入composite数组,并增加k的值
else
{
composite[k] = i;
k++;
}
}
// 将prime数组的大小(即素数的数量)赋给*prime_count指针所指向的变量
*prime_count = j;
// 将composite数组的大小(即合数的数量)赋给*composite_count指针所指向的变量
*composite_count = k;
}
函数的使用:对题目解答:
int main()
{
int N, prime[90], prime_count, composite[80], composite_count;
scanf("%d", &N);
// 开始一个无限循环,直到N的值在合法范围内时才退出循环。如果N的值不在10到100之间,程序会打印错误消息并提示用户重新输入。
for (;;)
{
if (N > 100 || N < 10)//合法判断
{
printf("Input error!Please input an integer N, 10 <= N <= 100.\n");
scanf("%d", &N);
}
// 如果N的值在合法范围内,那么退出循环。这里的else是对应if语句的,表示当N的值不在10到100之间时执行if下面的代码块,当N的值在合法范围内时则执行else下面的代码块。
else //直到输入合法后退出
break;
}
// 调用func函数,将N,prime,prime_count,composite和composite_count作为参数传入。
func(N, prime, &prime_count, composite, &composite_count);
// 打印素数的数量。
printf("%d\n", prime_count);
// 打印素数数组。
printf_arr1(prime, prime_count);
printf("\n");
// 打印合数的数量
printf("%d\n", composite_count);
//打印合数数组
printf_arr1(composite, composite_count);
return 0;
}