宏宇
Lv 6
宏宇 發問時間: 電腦與網際網路程式設計 · 2 0 年前

長整數(40位數以上)的加法

以下是我寫的,我的構想是把123+112123121讀入到 LONG_addition[] 字串,再利用一些字串的函數把 '+' 這個符號的位算出來,分別計算 '+' 左右兩邊的字元長度,把較長的那一個長度 assign 到 tmpLen,然後把 CUT_addition1[tmpLen]、CUT_addition2[tmpLen] 兩個準備存放 '+' 左右兩邊的字元的字串變數其初始值設為 '0' ,現在我剩下 CUT_addition1[tmpLen] + CUT_addition2[tmpLen],不知道該怎麼寫,請大家幫幫忙!謝謝

我的構思:

cin >> 123+1

cout <<

123

+ 001

cin >> 12+123

cout <<

012

+ 123

cin >> 123+112

cout <<

123

+ 112

※大概就是這樣,大家應該都看得懂吧!我把字串分解到新的兩個字串,現在剩下的工作,就是把這兩個新的字串加在一塊,變成另一個答案的字患,但怎麼寫?請大家幫個忙!謝謝

#include <iostream.h>

#include <iomanip.h>

#include <string.h>

#include <stdlib.h>

void main()

{

const int SLength=65536;

char LONG_addition[SLength];

char CUT_addition1[SLength];

char CUT_addition2[SLength];

//char SUM_addition[SLength];

int i,tmpLen;

cout << "請輸入→";

cin >> LONG_addition;

int LenChar = strlen(LONG_addition);//輸入的字串長度

int ADDafter = strlen(strchr(LONG_addition,'+'));//+字(含)後字串長度

int ADDplace = LenChar-ADDafter;//+字的位置

if (ADDplace >= (LenChar-ADDplace-1))//判斷加號右邊、左邊的字串長度,長的當 tmpLen

tmpLen=ADDplace;

else if (ADDplace < (LenChar-ADDplace-1))

tmpLen=(LenChar-ADDplace-1);

for (i=0;i<tmpLen;i++)//把CUT_addition1[]、CUT_addition2[]的初始值設為'0'長度是 tmpLen

CUT_addition1[i]=CUT_addition2[i]='0';

for (i=0;i<ADDplace;i++)//把加號左邊的字串由左到右輸到CUT_addition1[]

CUT_addition1[i+(tmpLen-ADDplace)]=LONG_addition[i];

int tLen=tmpLen-1;//把加號右邊的字串由右到左輸到CUT_addition2[]

for (i=LenChar-1;i>ADDplace;i--)

{

CUT_addition2[tLen]=LONG_addition[i];

tLen=tLen-1;

};

cout << endl;

//以下是直式顯示的部分

cout << " ";

for (i=0;i<tmpLen;i++)

cout << CUT_addition1[i];

cout << endl <<"+ ";

for (i=0;i<tmpLen;i++)

cout << CUT_addition2[i];

cout << endl;

//以下是算和的部分,和顯示和的部分,怎麼寫?

cin.get();

}

已更新項目:

cpp檔:http://home.kimo.com.tw/hongyu1222/ex05.cpp (可能要用續傳軟體下載喔,yahoo太機車了,直接連不給連!)

2 個已更新項目:

謝謝『玩回來了』大大,我想我大概懂了!!

另外還有一個問題,在你的解答中,

int add=0; 是不是寫成 int add; 就可以了??

1 個解答

評分
  • 匿名使用者
    2 0 年前
    最佳解答

    char SUM_addition[SLength+1]; <= 這個要SLength+1才行, 可能有進位

    // 要記得SUM_addition也都要填入0

    int j;

    int add=0; <= 記錄是否有進位

    // 故意寫清楚一點

    int value1, value2;

    int sum;

    // 要由個位數開始作

    // SUM_Addition可能會多一位, 所以填的位置不同

    for(i=tmpLen-1, j=tmpLen; i>=0; i--, j--) {

     value1=CUT_Addition1[i]-'0'; // 要記得字元和數值是不同的

     value2=CUT_Addition2[i]-'0';

     sum=value1+vale2+add; // 記得把進位一起加進來

     if(sum>10) { // 要進位

      add=1; // 記住就好了

      sum-=10; // 這個位數仍然保持一個數字而已

     }

     else { // 不用進位

      add=0; // 記得要清成0

     }

     SUM_addtion[j] = sum+'0'; // 變回顯示的字元

    }

    // 假設兩數是9999及1(反正就是會進位), 那上述迴圈只處理了4位數

    // 最後要記得把最後一個進位的值也填入

    SUM_addtiion[j]=add+'0';

      

    12/28補:

    int add; 分兩個狀況解釋

    (1)C是不會給初值的, 所以一開始就設定初值比較好

    (2)就這個例子來看,在if(sum>10)的判斷, 不論成功與否均有去設值, 所以外面沒設0是OK的

還有問題?馬上發問,尋求解答。