fork download
  1. /*計算1~n的最小公倍數*/
  2.  
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5.  
  6. /*計算x的y次方*/
  7. int power(int x, int y){
  8. int i=1;
  9. for(;y>0;y--)
  10. i*=x;
  11. return(i);
  12. }
  13.  
  14. /*計算A的元素個數*/
  15. int SizeOfA(int *A)
  16. {
  17. return sizeof(*A)/sizeof(*(A+0));
  18. }
  19.  
  20. /*
  21. main function首先從1開始尋找所有質數找出來存進P矩陣裡面
  22. 再把所有的質數對應的最高次方數存進Q矩陣裡面
  23. 最後將PQ對應元素用power這個函數將最小公倍數算出
  24. */
  25.  
  26. int main(){
  27. int now,n,PP[1],*P=PP,QQ[1],*Q=QQ,i,j,result;
  28. /*
  29.   now:現在正在找到哪個數
  30.   n:要從1找到哪個n的最小公倍數
  31.   P:質數矩陣
  32.   Q:次方矩陣
  33.   PP跟QQ:因為不知道指標陣列如何設定初始值所以如此
  34.   i:for迴圈裡跑P的元素個數
  35.   j:從SizeOfA找到的元素個數
  36.   result:最小公倍數
  37.   */
  38. while(scanf("%d",&n)!=EOF)
  39. {
  40. result = 1;
  41. /*已知最小質數為2,最小次方為1,也就是不考慮n<2*/
  42. *(P+0)=2;
  43. *(Q+0)=1;
  44. /*從3開始跑到n*/
  45. for (now=3;now<=n;now++)
  46. {
  47. int k,nowtemp,l=0;
  48. j=SizeOfA(P);
  49. /*找質數以及次方數*/
  50. for (i=0;i<=j-1;i++)
  51. {
  52. /*先用k紀錄次方數,如果比之前的次方數都還大再用Q記錄下來*/
  53. k=0;
  54. nowtemp=now;
  55. while (nowtemp%P[i]==0)
  56. {
  57. k++;
  58. nowtemp/=P[i];
  59. }
  60. l+=k;
  61. if (Q[i]<k)
  62. Q[i]=k;
  63. }
  64. /*如果之前都沒有記錄到任何次方,則判定此數為質數,增加我的PQ陣列*/
  65. if (l==0)
  66. {
  67. /*紀錄P的元素個數,並且觀察到realloc函數並沒有幫我增加元素個數*/
  68. printf("%d,%d\n",SizeOfA(P),j);
  69. P = (int *) realloc(P, (j+1)*sizeof(int));
  70. Q = (int *) realloc(Q, (j+1)*sizeof(int));
  71. /*紀錄P的元素個數,並且觀察到realloc函數並沒有幫我增加元素個數*/
  72. printf("%d,%d\n",SizeOfA(P),j);
  73. /*於是這一行fail,無法執行*/
  74. P[j]=now;
  75. printf("shit!");
  76. Q[j]=1;
  77. }
  78. }
  79. /*最後再把所有質數跟次方乘起來*/
  80. j=SizeOfA(P);
  81. for (i=0;i<=j-1;i++)
  82. {
  83. result *= power(P[i],Q[i]);
  84. printf("%d,%d,%d,%d\n",i,P[i],Q[i],result);
  85. }
  86. printf("%d\n",result);
  87. free(P);
  88. free(Q);
  89. }
  90. return 0;
  91. }
  92.  
Success #stdin #stdout 0s 2248KB
stdin
Standard input is empty
stdout
Standard output is empty