處理很長的數 加/乘法函式
作者:錢滄海
有時程式要處理很大的數,而且需要完全精確的值,這時double和float都派不上用場囉..這時只能靠陣列儲存BCD的數字型態囉..這裡提供加/乘法最大4096位的計算函式..
![]()
< class="code"> /*
發信人: newmike@pivot (pig), 信區: NCHU-WSC
標 題: 【長整數的加法與乘法】
*/ /* 程式名稱 : addlint.c */
/* 目的 : 求兩個長整數相加的結果 */
/* 設計者 : 錢滄海 Chien, Chang-hai */
/* 設計日期 : 12-03-1994 (紀念第一屈省長民選而作) */ #include < stdio.h >
#include < string.h > #define MAX_DIGITS 4096 /* 如果不夠長可以改這一列 */ void main(void)
{ char a[MAX_DIGITS 1], b[MAX_DIGITS 1], result[MAX_DIGITS 2],
*num_1, *num_2;
int i, carry, temp, str_length_1, str_length_2; printf("請輸入兩個長整數(** 請勿超過 %d 位 **)\n",
MAX_DIGITS);
gets(a); gets(b);
str_length_1 = strlen(a); str_length_2 = strlen(b);
if(str_length_1 > str_length_2)
{ temp = str_length_1;
str_length_1 = str_length_2;
str_length_2 = temp;
num_1 = b; num_2 = a;
}
else
{ num_1 = a; num_2 = b;
}
strrev(num_1); strrev(num_2);
for(carry = 0, i = 0; i < str_length_1; i )
{ temp = (num_1[i] - '0') (num_2[i] - '0') carry;
result[i] = (temp % 10) '0';
carry = temp / 10;
}
for(i = str_length_1; i < str_length_2; i )
{ temp = (num_2[i] - '0') carry;
result[i] = (temp % 10) '0';
carry = temp / 10;
}
if(carry == 0)
{ result[str_length_2] = '\0';
}
else
{ result[str_length_2] = carry '0';
result[str_length_2 1] = '\0';
}
strrev(a); strrev(b); strrev(result);
printf("%*s\n", str_length_2 3, a);
printf(" )%*s\n", str_length_2 1, b);
for(i = 0; i < str_length_2 3; i )
printf("-");
printf("\n%*s\n", str_length_2 3, result);
} /* 程式名稱 : timelint.c */
/* 目的 : 求兩個長整數相乘的結果 */
/* 設計者 : 錢滄海 Chien, Chang-hai */
/* 設計日期 : 12-03-1994 (紀念第一屈省長民選而作) */ #include < stdio.h >
#include < string.h > #define MAX_DIGITS 4096 /* 如果不夠長可以改這一列 */ void main(void)
{ char a[MAX_DIGITS 1], b[MAX_DIGITS 1], result[2 * MAX_DIGITS 1],
*num_1, *num_2;
int i, j, carry, temp, str_length_1, str_length_2; printf("請輸入兩個長整數(** 請勿超過 %d 位 **)\n", MAX_DIGITS);
gets(a); gets(b);
str_length_1 = strlen(a); str_length_2 = strlen(b);
if(str_length_1 > str_length_2)
{ temp = str_length_1;
str_length_1 = str_length_2;
str_length_2 = temp;
num_1 = b; num_2 = a;
}
else
{ num_1 = a; num_2 = b;
}
strrev(num_1); strrev(num_2);
for(i = 0; i < str_length_1 str_length_2 - 1; i )
result[i] = '0';
for(i = 0; i < str_length_1; i )
{ for(carry = 0, j = 0; j < str_length_2; j )
{ temp = (num_1[i] - '0') * (num_2[j] - '0')
(result[i j] - '0') carry;
result[i j] = (temp % 10) '0';
carry = temp / 10;
}
}
if(carry == 0)
{ result[str_length_1 str_length_2 - 1] = '\0';
}
else
{ result[str_length_1 str_length_2 - 1] = carry '0';
result[str_length_1 str_length_2] = '\0';
}
strrev(a); strrev(b); strrev(result);
printf("%*s\n", str_length_1 str_length_2 2 , a);
printf("x)%*s\n", str_length_1 str_length_2 , b);
for(i = 0; i < str_length_1 str_length_2 2; i )
printf("-");
printf("\n%*s\n", str_length_1 str_length_2 2, result);
} /*
┌--------┐
│ RESULT │
└--------┘
D:\TC>addlint
請輸入兩個長整數(** 請勿超過 4096 位 **)
2892349002340023490123897278989289892389182348423894829389234203992323
33848374374920310919271232871836110201928718237838749349394939943934
2892349002340023490123897278989289892389182348423894829389234203992323
) 33848374374920310919271232871836110201928718237838749349394939943934
-------------------------------------------------------------------------
2926197376714943801043168511861126002591111066661733578738629143936257 D:\TC>timelint
請輸入兩個長整數(** 請勿超過 4096 位 **)
2389293023094993450020348293402349
248829392994884052237378271873132
2389293023094993450020348293402349
x) 248829392994884052237378271873132
---------------------------------------------------------------------
573506130412438603201678465666068515396354853146965059073558787068
*/
網路志
工聯盟----Visita網站
http://www.vista.org.tw
---[ 發問前請先找找舊文章 ]--- 發表人 - axsoft 於 2002/12/11 19:13:26