C語言 C語言分解質因數的演算法,以及動態一維陣列儲存分解的質因數的每一項
阿新 • • 發佈:2019-01-26
這裡儲存下,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