❶ 怎樣用C語言做超大整數的加減運算
用高精度演算法來實現,即用數組或指針來儲存數字,例如A〔20〕來儲存a ,用B〔20〕來儲存b,這樣a 和b就可以是很大的數,再用一個C〔21〕來儲存結果,為什麼C要21呢,你知道,加法是要近位的,呵呵。這里給出相加的偽代碼,d =0/*用來存儲近位*/,for i=0到19{c=A〔i〕+B〔i〕+d ,d =c/10,c=c%10,C〔i〕=c}if d 不等於0 C〔i+1〕=d ,再逆的輸出C就可以了!編程要學會思考,現在你可以試試編下高精度乘法,例如可以輸出100的階乘!
❷ 如何實現兩個超大整數的相乘
*函數名稱: 大數乘法
*函數過程:1 輸入兩個大數作為字元串
* 2 作一個雙向鏈表
* 3 兩個指針分別指向數字字元串的最低位
* 4 以第一個數的最低的一個位乘以第二個數的所有項存於鏈表中
* 5 鏈表首指針移
* 6 重復4,5依次從最低位乘到最高位
* 7 乘完後因為最低位是鏈表首,最後一位是鏈表尾。所以在逆順輸出鏈表。
* 4 直到循環結束
*入口參數:numa,numb,result字元串
*出口參數:無
*--------------------------------------------------------------------------*/
void multiply(char *numa, char *numb ,char *result)//用來儲結果的)//計算乘積
{
char *pna = findend(numa);//指向numa的一個指針。point numa pna 指向乘數的最低位,
char *pnb = findend(numb);//指向numb的一個指針 //pnb 指向被乘數的最低位,
int along=(int)strlen(numa);//標記數字a的長度;
int blong=(int)strlen(numb);//標記數字b的長度;
int carry=0,temp_result;//存貯進位 和臨時結果的
Node *head, // 用於存貯頭指針
*pstart, // 用於存貯計算時的首指針
*pnew, //作於申請新結點
*pgo; //作為每計算完一行時,回到下一行起始節點用,移位標致來用
head = pstart =new Node;//初始化首結點和頭結點。
pstart -> data = 0;
pstart -> next = NULL;
pstart -> ahead = NULL;
while (along--)
{
pgo = pstart;//保存進位點
blong = (int)strlen(numb);//初始化長度
pnb = findend(numb); //初始化指針
while ((blong-- && (blong>=0))|| carry != 0)
{
if(!pstart->next)//如果當前為空結點,則申請新結點
{
pnew = new Node;
pnew -> data = 0;
pnew -> next = NULL;
pnew -> ahead = pstart;
pstart -> next = pnew;
}
if(blong<0)temp_result = carry ;//處理只有進位的情況
else temp_result =(pstart->data+(*pna-48)*(*pnb-48)+carry);//自身值+新值+進位作為新值
pstart -> data = temp_result%10; //存貯個位
carry = temp_result/10; //存貯進位
pstart = pstart -> next; //結點移動
pnb--; //指針移向被乘數高位
}
pstart = pgo->next; //前進一個位置;
pna--; //指針移向乘數高位
}
pstart =head;//尋找鏈表的結尾點
while(pstart->next != 0)
{
pstart->data += 48;//!!<<<因為我們的輸出是字元。所以再此加上48>>>> 逆順輸出
pstart = pstart->next ;
}
int tip = 0;//轉為字元串用
pstart = pstart->ahead ;//找有效字
while(pstart != 0)//輸出正序的結果;
{
result[tip++] = pstart->data;
pstart = pstart->ahead ;
}
result[tip] = '\0';
pstart =head; //釋放空間
while(pstart->next != 0)
{
pnew = pstart->next ;delete pstart;
pstart =pnew;
}
return ;
}
❸ c語言定義超大數字類型
沒有這樣的類型,不過大數可以通過大數數組來實現,有專門的數據結構演算法。
可以參考如下的乘法實現:
大數乘法:按照32位機器表示法,最多可計算結果為32位以內的數的乘法,否則會溢出;藉助字元串轉換,可以解決這一問題;#include<stdio.h>
#include<string.h>
#define MAX 100
#define MUX 200
char A[MAX];
char B[MAX];
int reverse(char str[],int len){
char temp;
int i;
for(i=0;i<(len+1)/2;i++){
temp=str[i];
str[i]=str[len-i-1];
str[len-i-1]=temp;
}
return 0;
}
int main(void){
char *ptr;
int increase=0;
ptr=A;
int i=0;
int j=0;
int temp=0;
int add=0;
printf("input the first number:");
scanf("%s",ptr);
ptr=B;
printf("\ninput the second number:");
scanf("%s",ptr);
printf("%s*%s=",A,B);
reverse(A,strlen(A));
reverse(B,strlen(B));
char result[MUX];//array to store the result;
for(i=0;i<MUX-1;i++)
result[i]='0';//initial the array,every bit is 0;
for(i=0;i<strlen(A);i++){
increase=0;
for(j=0;j<strlen(B);j++){
temp=(A[i]-48)*(B[j]-48);
add=(temp+increase+(result[i+j]-48))%10;
increase=(temp+increase+(result[i+j]-48))/10;
result[i+j]=add+48;
if(j==strlen(B)-1&&increase>0)
result[i+j+1]=increase+48;
}//for j
}//for i
int k=0;
char temper;
reverse(result,MUX-1);//attention :MUX-1
int writeflag=0;
printf("\nthe result is:");
for(i=0;i<MUX;i++){
if(result[i]!='0') writeflag=1;
if(writeflag==1)
printf("%c",result[i]);
}
printf("\n");
return 0;
}//return main