C语言综合实验质数表与完美数

/*
	综合实验二:因式分解与完美数
								*/

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>

void PrimeNumber(int n, int prime[])				//求出小于输入值的所有质数并存入数组中
{
	int i,k,flag=0,j=1;
	for (k = 3; k < n; k++)
	{
		for (i = 2,flag=0; i < k; i++)
		{
			if (k % i != 0)
				flag++;
			else continue;
		}
		if (flag == k-2)
		{
			prime[j] = k;
			j++;
		}
		else continue;
	}
}
int Prime(int i)
{
	for (int k = 2; k * k <= i; k++)
	{
		if (i % k == 0)
			return 0;
	}
	return 1;
}
int num_prime(int a, int prime[])
{
	int num = 1;
	for (int i = 2; i < a; i++)
	{
		if (Prime(i))
		{
			prime[num - 1] = i;
			num++;
		}

	}
	return num;
}
void InitiateZero(int a[],int len)
{
	int i;
	for (i = 0; i < len; i++)
	{
		a[i] = 0;
	}
}

int Factor(int prime[], int factor[], int number[], int num)
{
	int i = 0, n = 0, m = 0;
	for (i = 0; num >= prime[i];)
	{
		if (num % prime[i] == 0)
		{
			if (n == 0)
			{
				factor[n] = prime[i];
				num = num / prime[i];
				n++;
			}
			else
			{
				if (prime[i] == factor[n - 1])
				{
					num = num / prime[i];
					number[m]++;
				}
				else
				{
					factor[n] = prime[i];
					num = num / prime[i];
					m++;
					n++;
				}
			}
		}
		else
			i++;
	}
	return n;
}

int main()
{
	int prime[1500] = { 2, }, factor[500] = { 0 }, number[500] = { 0 }, sum[500] = { 0 };
	int num, len = 0, i, k = 0, c, check=0;
	int NUM,cnt=0,t=0;
	int m = 0, n, p = 0, q, a = 1, b = 1;
	system("title 综合实验二:因式分解与完美数");
	printf("*******综合实验二:因式分解与完美数*******\n");
	printf("\n");
	printf("******************************************\n");
	printf("\n");
	printf("请选择您所需要的功能:\n");
	printf("1.应用质数表对输入数字进行因式分解。\n");
	printf("2.输出10000以内的完美数。(完美数:数n真因数的总和为数n本身)\n");
	printf("0.结束程序。\n");
	do
	{
		printf("\n");
		printf("请输入对应数字:");
		scanf_s("%d", &c);
		printf("\n");
		switch (c)
		{
		case 1:
			printf("Please enter the number:");
			scanf_s("%d", &num);
			PrimeNumber(num, prime);
			k = 0;
			InitiateZero(factor, 500);
			for (i = 0; prime[i] != '\0'; len++, i++);		//得出质数表中元素的个数
			for (i = 0; i < len;)
			{
				if (num % prime[i] == 0)
				{
					factor[k] = prime[i];
					num = num / prime[i];
					k++;
				}
				else
					i++;
			}
			printf("The factors of the number are:");
			if (factor[0] == '\0')
				printf("Failed!");
			else
			for (i = 0; factor[i] != '\0'; i++)
			{
					printf("%d ", factor[i]);
			}
			break;
		case 2:
			NUM = 10000;
			len = num_prime(NUM, prime);
			printf("10000以内的完美数有:");
			for (i = 2; i < NUM; i++)
			{
				m = 0;
				b = 1;
				InitiateZero(factor, 500);         //保证循环开始时两数组的值都为零
				InitiateZero(number, 500);
				n = Factor(prime, factor, number, i);   //n代表i的互异因数的个数,同时对number和factor数组进行处理
				for (p = 0; p < n; p++)              
				{
					sum[p] = 1;
					for (q = 0; q <= number[m]; q++)
					{
						a = a * factor[p];
						sum[p] += a;
					}
					a = 1;
					m++;
				}
				for (p = 0; p < n; p++)
					b = b * sum[p];             
				if (b == 2 * i)
					printf("%d ", i);
			}
			break;
		case 0:
			check = 1;
			printf("\n");
			printf("		[**程序结束**]");
			printf("\n");
			break;
		}
	} while (check==0);
	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值