编写函数实现将大于等于2小于等于N的整数按是否为素数分成两类。

给定一个[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;
}

  • 14
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值