2007-10-21 05:45:26小蝦米

10月21日 CAL題目解答 7-11題

第七題(最小的質數):
 
# include
int main ()
{
 int num = 0;
 int divisor= 0;
 int remainder= 0;
 int answer= 0;

 scanf (”%d”, &num);


 while (answer== 0)
 {
  num ++;
  divisor= 2;
  remainder= 1;
  while ( 0!= remainder && num!= divisor)
  {
   remainder= (num%divisor);
   divisor++ ;
  } // end while
  if (num == divisor)
   answer= num;
 
 } // end while
 
 printf (”%dn”, answer);
 return 0;

} // end main ()

第八題(兩數之間有幾個質數?):

# include
int main ()
{
 int num1= 0; // 找到的質數
 int num2= 0;
 int divisor= 0; // 除數
 int remainder= 0; // 找質數過程中所需的餘數
 int numnum= 0;

 scanf (”%d”, &num1);
 scanf (”%d”, &num2);

 
 while (num1<= num2) // 只找到limit
 { 
  remainder= 1; //為了先給下面的while有數字可以驗證,先在此指定remainder的數
  divisor= 2;
  while (0!= remainder&& num1 != divisor) //檢查這個數是不是質數   {
   remainder= (num1%divisor);
   divisor= (divisor+1);
  } // end while
  if (0== remainder) // 如果此數是因為餘數為0而跳出迴圈
   num1++ ; // 輸入下個數(但這個數不是質數)
  else // 剩下的數就是質數
  { 
   numnum ++;
   num1= (num1+1); // 輸入下個數
  } // end else
 } // end while
 
 printf (”%dn”, numnum);
 
 return 0;
}// end main ()

第九題(有幾個質因數?):

# include
int main ()
{
 int num= 0;
 int divisor= 0; // 除數
 int remainder= 0; // 過程中所需的餘數
 int numnum= 0;
 int remainder2= 0;
 int divisor2= 0;

 scanf (”%d”, &num);

 remainder= 1; //為了先給下面的while有數字可以驗證,先在此指定remainder的數
 divisor= 2;
 while ( num >= divisor)
 {    
  remainder= (num%divisor);
  if (remainder== 0)
  {
   divisor2= 2; remainder2= 1;
   while (0!= remainder2 && divisor != divisor2)
   {
    remainder2= (divisor%divisor2);
    divisor2 ++ ;
   } // end while
   if (divisor== divisor2)
    numnum ++ ;
  
  } // end if
  
  divisor ++ ;
 } // end while

 numnum ++;
 printf (”%dn”, numnum);
 return 0;

}// end main ()

註:先找到這個數的因數,再檢驗這個因數是不是質數。都是的話,numnum+1。

第十題(因數分解):

# include
int main ()
{
 int num= 0;
 int test= 0;
 
 scanf (”%d”, &num);
 test= 2;
 while (num>1)
 {
  if (0 == num%test )
   printf (”%dn”, test);
  while (0 == num%test) // 萬一這個質因數有相同的,例如2、2,就把它全部除掉,這樣接下去就不會檢驗到這個因數了。
   num= num/test;
  test ++;
 } // end while
 return 0;
} // end main

註:
  蝦密(又)!?怎麼這麼少?對,就這麼少。既然程式碼這麼少,那我註解就寫多一點吧。事實上,在這題我利用小學教的因式分解短除法來做的,其要點就是「找到一個質因數後,將原數用質因數除掉」,如此可以減少程式碼的複雜和runtime,且找到的必為質因數(不是質數的因數都先被除掉了)。

第十一題(有幾個質數?):

# include
int main ()
{
 int num= 0;
 int remainder= 0;
 int divisor= 0;
 int numnum= 0;

 scanf (”%d”, &num);
 while (num!= -1)
 {
  if (num== 1)
   numnum ++ ;
  else
  {
   divisor=2;
   remainder= 1;
   while (0!= remainder && num != divisor) //檢查這個數是不是質數
   {
    remainder= (num%divisor);
    divisor ++ ;
   } // end while
   if (0 == remainder )
    ;
   else
    numnum ++; 
  } // end else
  scanf (”%d”, &num);
 } // end while
 printf (”%dn”, numnum);

 return 0;
} // end main

心得:
  這星期的CAL有點欠缺挑戰性...大家說是不是阿~~(是~~)
kitty 2007-10-22 23:53:01

不是!!!!

版主回應
不是你大頭= = 2007-10-24 00:25:50