/*
综合实验二:因式分解与完美数
*/
#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;
}
C语言综合实验质数表与完美数
最新推荐文章于 2024-08-04 14:29:09 发布