2011年4月21日 星期四

最大公因數 GCD

最大公因數(Greatest Common Divisor,簡寫為G.C.D.;或Highest Common Factor,簡寫為H.C.F.),指某幾個整數共有因數中最大的一個。
兩個整數的最大公因數主要有三種尋找方法:
參考來源:最大公因數 - 維基百科展轉相除法 - 維基百科

//
//還沒加入檢查輸入不可為float(浮點數)
//
#include <stdio.h>
#include <stdlib.h>

#define INT int
#define UINT unsigned int
#define STATUS
#define SUCCESS 0
#define ERROR_PARSE 1
#define ERROR_BUFFER 2
#define DEVISOR_FIRST_VALUE 1

//求出兩傳入值的最大公因數。
STATUS UINT
CaculateGcd(INT InputVariableA,INT InputVariableB,UINT *Result);

//
//輸入兩數,求最大公因數
//
int main(int argc, char *argv[]){
  INT InputVariableA;
  INT InputVariableB;
  UINT Result;
  UINT Status;

  InputVariableA = NULL;
  InputVariableB = NULL;
  Status = NULL;
  Result = DEVISOR_FIRST_VALUE;
 
  //等待按鍵輸入
  scanf("%d %d", &InputVariableA, &InputVariableB);
  printf("您輸入的數字為%d, %d\n", InputVariableA, InputVariableB);

  //呼叫副程式,求最大公因數,然後判斷Status。
  Status = CaculateGcd(InputVariableA, InputVariableB, &Result);
  switch(Status){
    case(SUCCESS):
      printf("%d與 %d的最大公因數為:%d\n", InputVariableA, InputVariableB, Result);
      break;
    case(ERROR_PARSE):
      printf("Error No. = %d,傳入值錯誤\n", ERROR_PARSE);
      break;
    case(ERROR_BUFFER):
      printf("Error No. = %d,Buffer錯誤\n", ERROR_BUFFER);
      break;
  }

  system("PAUSE");
  return 0;   
}

//求出兩傳入值的最大公因數。
STATUS UINT
CaculateGcd(INT InputVariableA, INT InputVariableB, UINT *Result){
  UINT Bigger;
  UINT Smaller;
  UINT Buffer;

  //檢查傳入值
  if(InputVariableA == NULL || InputVariableB == NULL || InputVariableA < 1 || InputVariableB < 1){
     return ERROR_PARSE;//不接受的傳入值
  }
  if(*Result != DEVISOR_FIRST_VALUE){
    return ERROR_BUFFER;//Buffer錯誤          
  }

  //(1)檢查兩數是否相等。
  if(InputVariableA == InputVariableB){
    *Result = InputVariableA;
    return SUCCESS;
  }

  //(2)檢查兩數之中,何為大數,何為小數。 
  if(InputVariableA > InputVariableB){
    Bigger = InputVariableA;
    Smaller = InputVariableB;                 
  } else{
    Bigger = InputVariableB;
    Smaller = InputVariableA;     
  }

  //(3)輾轉相除法
  do{
    Buffer = Bigger % Smaller;
    if(Buffer == 0){
      *Result = Smaller;
    } else {
      Bigger = Smaller;
      Smaller = Buffer;
    }
  } while(Buffer != 0);

  return SUCCESS;
}

沒有留言:

張貼留言