C语言 C语言分解质因数的算法,以及动态一维数组保存分解的质因数的每一项

这里保存下,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


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值