这里保存下,C语言分解质因数的算法,以及动态一维数组保存分解的质因数的每一项。。。。
/**
分解质因数法求最小公倍数,最大公约数,
我写不下去了,这里是分解质因数的方法,和返回质因数的动态数组
*/
/*
质因数分解法
质因数分解
质因数分解法:
最大公约数:
把每个数分别分解质因数,再把各数中的全部公有质因数提取出来连乘,所得的积就是这几个数的最大公约数。
例如:求24和60的最大公约数,先分解质因数,得24=2×2×2×3,60=2×2×3×5,24与60的全部公有的质因数是2、2、3,它们的积是2×2×3=12,所以,(24、60)=12。
最小公倍数:
把几个数先分别分解质因数,再把各数中的全部 公有的质因数 和 独有的质因数 提取出来连乘,
所得的积就是这几个数的最小公倍数。
例如:求6和15的最小公倍数。先分解质因数,得6=2×3,15=3×5,6和15的全部公有的质因数是3,6独有质因数是2,15独有的质因数是5,2×3×5=30,30里面包含6的全部质因数2和3,还包含了15的全部质因数3和5,且30是6和15的公倍数中最小的一个,所以[6,15]=30。
*/
#include<stdio.h>
int* PrimeFactor(int n);
int main()
{
// int n;
// printf("输入合数:");
// scanf("%d",&n);
// printPrimeFactor(n);
// int* PrimeFactor1=PrimeFactor(n);
// //打印动态数组里面存储的质因数
// printPrimeFactor1(PrimeFactor1);
int* PrimeFactor2=PrimeFactor(45);//分解45的质因数,并且返回动态数组
printPrimeFactor1(PrimeFactor2);
int* PrimeFactor3=PrimeFactor(30);
printPrimeFactor1(PrimeFactor3);
// free(PrimeFactor1);//释放空间
free(PrimeFactor2);
free(PrimeFactor3);
return 0;
}
void printPrimeFactor(int n)//对数n分解质因数
{
printf("分解质因数:%d=",n);
int factor=2;//最小的质因数为2
int flag=0;
while (factor <= n)//合数大于等于因数
{
if (n % factor == 0)//刚开始是除以2这个质数,一直除到到没有2的质数因数为止
{
n = n / factor;//除以这个质数
if(flag==0)//if/else语句只是为了不输出第一个乘号“*”
flag=1;
else
printf("*");//输出乘号
printf("%d",factor);//输出质因数
}
else
{
factor++;//质因数加一,
}
}
}
int* PrimeFactor(int n)//对数n分解质因数
{
int length=1;
int* PrimeFactor=(int*)malloc(sizeof(int)*length);//申请一个空间
printf("分解质因数:%d=",n);
int factor=2;//最小的质因数为2
int flag=0;
int i=0;
while (factor <= n)//合数大于等于因数
{
if (n % factor == 0)//刚开始是除以2这个质数,一直除到到没有2的质数因数为止
{
n = n / factor;//除以这个质数
// if(flag==0)//if/else语句只是为了不输出第一个乘号“*”
// flag=1;
// else
// printf("*");//输出乘号
// printf("%d",factor);//输出质因数
PrimeFactor[i++]=factor;//把这个存到动态数组中
length++;//动态数组长度加一,是这样的话那动态数组最后一个元素多久永远用不到了。。。
PrimeFactor=(int*)realloc(PrimeFactor,length);//重新分配空间,并拷贝之前的数据到新的空间里
PrimeFactor[i]=-1;//写入一个负数表示动态一维数组的尾部
}
else
{
factor++;//质因数加一,
}
}
return PrimeFactor;//返回这个动态的数组
}
void printPrimeFactor1(int *PrimeFactor1)
{
int flag=0;
while(*PrimeFactor1!=-1)
{
if(flag)//如果flag==1
printf("*");
else
flag=1;//如果flag==0,
printf("%d",*PrimeFactor1++);//先从动态数组中取出值,然后指针前移
}
}
结果:
分解质因数:45=3*3*5分解质因数:30=2*3*5