#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; }
This blog contains posts regarding my practice in programming. The posts are about questions in Yahoo Knowledge or some program design ideas or implementation of algorithms.
Friday, January 13, 2012
利用C語言寫出長整數2進位轉10進位
Labels:
C
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment