1. 程式人生 > >《C語言的科學與藝術》課後習題答案第六章(部分)

《C語言的科學與藝術》課後習題答案第六章(部分)

6.2//素數分解,並顯示各因子,列60,2*2*3*5 #include <stdio.h> #include <genlib.h> #include <simpio.h> #include <math.h> bool IsPrime(int n); void PrintPrime(int num); void main() { int num; printf("請輸入要分解的數:"); num=GetInteger(); if (num<=1) { printf("輸入有誤!請輸入要分解的數:"); num=GetInteger(); }  else { if (IsPrime(num)) { printf("%d=1*%d",num,num); }  else { PrintPrime(num); } } printf("\n"); } bool IsPrime(int n) { int i,limit; if (n<=1) { return (FALSE); } if (n==2) { return (TRUE); } if (n%2==0) { return (FALSE); } limit=sqrt(n)+1; for(i=3;i<=limit;i+=2) { if (n%i==0) { return (FALSE); } } return (TRUE); } void PrintPrime(int num) { int i=2; if (IsPrime(num)) { printf("%d",num); }  else { while(i<num) { if (num%i==0) { printf("%d*",i); PrintPrime(num/i); break; }  else { i++; } } } } 6.3//列印1~9999之間的完全數,完全數是指其真約數(除其本身以外的約數)之和等於其本身的數。 #include <stdio.h> #include <genlib.h> #include <math.h> bool IsPerfect(int n);          //判斷完全數的函式 void main() { int i,j=0;                  //i是迴圈變數,j控制格式換行用 printf("本程式的目的是列印1~9999之間的完全數!\n"); for (i=1;i<10000;i++) { if (IsPerfect(i)) { printf("]",i); j++; if (j!=0 && j%2==0) { printf("\n"); } } } } //方法一 //方法二 bool IsPerfect(int n) { int sum=1,i,limit; limit=sqrt(n)+1; for(i=2;i<limit;i++) { if (n%i==0) { sum+=i+n/i; } } if (sum==n&&sum!=1) { return (TRUE); }  else { return (FALSE); } } 6.5//求立方根,由sqrt的牛頓演算法演化二來 #include <stdio.h> #include <simpio.h> #include <genlib.h> #include <math.h> #define Epsilon 0.000001 bool ApproximatelyEqual(double x,double y); double CubeRoot(double x); double Min(double a,double b); void main() { double n; printf("本程式從使用者那裡讀取一個數字,然後輸出該數字的立方根!\n"); printf("請輸入要計算的數字:"); n=GetReal(); printf("%f的立方根是:%.4f\n",n,CubeRoot(n)); } double CubeRoot(double x) { double g; if (x==0) { return (0); } g=x; while(!ApproximatelyEqual(x,g*g*g)) { g=(2*g+x/g/g)/3;                 //立方根牛頓演算法 } return (g); } bool ApproximatelyEqual(double x,double y) { if (fabs(x-y)/Min(fabs(x),fabs(y))<Epsilon) { return TRUE; }  else { return FALSE; } } double Min(double a,double b) { if (a>=b) { return (b); }  else { return (a); } }