請設計乙個演算法來完成兩個超長正整數的加法。
*問題分析與演算法設計
首先要設計一種資料結構來表示乙個超長的正整數,然後才能夠設計演算法。
首先我們採用乙個帶有表頭結點的環形鏈來表示乙個非負的超大整數,如果從低位開始為每 個數字編號,則第一位到第四位、第五位到第八位...的每四位組成的數字,依次放在鍊錶的第乙個、第二個、...結點中,不足4位的最高位存放在鍊錶的最後乙個結點中,表頭結點的值規定為-1。例如:
大整數「587890987654321」可用如下的帶表頭結點head的鍊錶表示:
按照此資料結構,可以從兩個表頭結點開始,順序依次對應相加,求出所需要的進製後代入下面的運算。具體的實現演算法請見程式中的注釋。
*程式說明與注釋
#include
#include
#define hunthou 10000
typedef struct nodenode; /*定義鍊錶結構*/
node *insert_after(node *u,int num); /*在u結點後插入乙個新的node,其值為num*/
node *addint(node *p,node *q); /*完成加法操作返回指向*p+*q結果的指標*/
void printint(node *s);
node *inputint(void);
int main()
node *insert_after(node *u,int num)
node *addint(node *p,node *q) /*完成加法操作返回指向*p+*q結果的指標*/
r=(pp->data!=-1)?pp:qq; /*取尚未自理完畢的鏈指標*/
while(r->data!=-1) /*處理加數中較大的數*/
if(carry) t=insert_after(t,1); /*處理最後一次進製*/
t->next=s; /*完成和的鍊錶*/
return s; /*返回指向和的結構指標*/
}node *inputint(void) /*輸入超長正整數*/
*p,*q;
int i,j,k;
long sum;
char c;
p=null; /*指向輸入的整數,鏈道為整數的最低的個位,鏈尾為整數的最高位*/
while((c=getchar())!='\n') /*輸入整數,按字元接收數字*/
if(c>='0'&&c<='9') /*若為數字則存入*/
s=(node *)malloc(sizeof(node));
s->data=-1; /*建立表求超長正整數的鏈頭*/
ps=s;
while(p!=null) /*將接收的臨時資料鏈中的資料轉換為所要求的標準形式*/
qs=(node *)malloc(sizeof(node)); /*申請空間*/
qs->data=sum; /*賦值,建立鍊錶*/
ps->next=qs;
ps=qs;
}ps->next=s;
return s;
}void printint(node *s)}}
*執行結果
*思考題
請設計完成兩個超長正整數的減法、乘法和除法的運算。
超長正整數的加法
問題描述 編寫程式實現兩個超長正整數 每個最長80位數字 的加法運算。輸入形式 從鍵盤讀入兩個整數,要考慮輸入高位可能為0的情況 如00083 第一行是超長正整數a 第二行是超長正整數b 輸出形式 1.用字串輸入兩個超長整數,分別存放在兩個字串中,每一位對應乙個字串中的字元。2.以較短的超長整數為基...
超長正整數相加
請設計乙個演算法完成兩個超長正整數的加法。輸入引數 string addend 加數 string augend 被加數 返回值 加法結果 思路 兩個數相加,可先將兩個數長度對齊,短的用0補齊後再計算。兩個數相加的結果長度至多為較大的數長度加1。可以用乙個陣列來存放結果。public class m...
超長正整數相加
請設計乙個演算法完成兩個超長正整數的加法。介面說明 輸入引數 string addend 加數 string augend 被加數 返回值 加法結果 public string addlonginteger string addend,string augend 輸入描述 輸入兩個字串數字 輸出描述...