1. 程式人生 > >C語言 C語言分解質因數的演算法,以及動態一維陣列儲存分解的質因數的每一項

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