Friday, January 13, 2012

利用C語言寫出長整數2進位轉10進位

 
#include "stdio.h"
#define size 128

//sum[0]視為第0位, sum[1]第1位 依此類推
//例如若這陣列記14547,則sum[4] ~ sum[0]分別是1,4,5,4,7
int sum[size] = {0};

void Double()
{
 //就是把sum陣列這個長整數的值加倍,我的算法是自己加自己

 int i;
 int carry = 0; //代表有進位

 for (i = 0; i < size; i ++)
 {
  //i = 0 時,carry為0,因為第一位不會有進位
  //i > 0 時,carry 值為
  //當sum[i-1]+sum[i-1]加前一個carry>=10時就設為1,不是則為0
  //例如計算38+38,sum[0]的值為先算完sum[0]+sum[0]=16,
  //而16>10,所以設carry = 1及sum[0] = 16-10 = 6
  //接著sum[1]的值為sum[1]+sum[1]+carry = 3 + 3 + 1 = 7

  sum[i] = sum[i] + sum[i] + carry; 

  if (sum[i] >= 10)
  {
   //若這位數的和大於等於10,代表有進位,
   //這一位要減10,而下一位要多加1,
   carry = 1;
   sum[i] -= 10 ;
  }
  else
   carry = 0;
 }
}

void Add1()
{
 //就是把sum陣列的值 + 1,
 //例如136變137,其中sum[2] = 1, sum[1] = 3, sum[0] = 6,
 //變sum[2] = 1, sum[1] = 3, sum[0] = 7
 //或39變40,其中sum[1] = 3, sum[0] = 9,
 //變sum[1] = 4, sum[0] = 0

 int i = 0;
 int carry = 0;
 
 sum[0] ++;
 if ( sum[0] == 10)
 {
  //加1後若有進位,則只可能是10
  //於是carry為1,sum[0]值就為尾數0,
  carry = 1;
  sum[0] = 0;
 }

 //若carry不是1,則結尾加1後,就完成了加1;
 //是的話,則要從第二位起繼續加。例如99+1=100,sum[1]和sum[2]也跟著變
 while ( carry == 1)
 { 
  //遇到結尾是9, 99, 或9999...時,才會跑進這while
  i++;  //代表再走到下一位
  sum[i] ++; //表示這一位多加carry值1,所以sum[i]++
  if (sum[i] == 10)
  {
   //若還繼續進位的話,就會繼續維持carry = 1,sum[i]這位則變為9+1-10=0
   sum[i] = 0;
  }
  else
   break;  //表示沒繼續進位,也完成了這個數加1
 }

}


int main()
{
 int i;
 char str[size];
 int weisu;

 printf("請輸入二進位數字字串(例如01001)\n");
 scanf("%[0-1]", str); //也可把[0-1]改成d


 for (i = 0 ; i < size ; i++)
 {
  if (str[i] == '\0')
   break;

  Double(); //把sum陣列的值加倍

  if (str[i] == '1') 
   Add1();  //是1的話就多加1,不是的話就不用
 }


 //weisu代表sum陣列代表的數的最高位。
 //例如若輸入為11001,sum代表值就會是25 (sum[1] = 2, sum[0] = 5),
 //而weisu 會等於 1

 weisu = size - 1; 
 
 //從size-1位開始,找到真正的weisu
 //例如sum陣列從最高位起為00...0015,
 //就從最高位起開始找,直到遇到的第一個不是0的位數時停下來
 //此處就代表sum的weisu
 while (sum[weisu] == 0 && weisu >= 0)
  weisu--;

 printf("這個二進位數字的十進位為:");

 if (weisu == -1)
  printf("0\n"); //沒有sum[-1],但若遇到weisu = -1則sum代表的值必是0
 else
 {
  //從最高位印到第0位
  for (i = weisu; i >= 0 ; i --)
   printf("%d", sum[i]);

  printf("\n");

 }


 system("pause");
 return 0;
}

No comments:

Post a Comment