問題描述
計算機所能完成的乙個基本功能就是完成資料的計算,譬如加法、減法等等。但是在任何一種計算機上,計算中能夠使用的數字都是有一定範圍的,超過了範圍,就沒法得到精確的結果。
你現在接受了乙個任務,要編寫乙個高精度計算器的核心部分。所謂高精度計算器,就是可以計算很大很大的資料的計算器。而你所需要編寫的程式,就是真正完成高精度加法和高精度減法運算的兩個函式,因為程式其它的部分已經由別人編寫好了。
函式的輸入、輸出介面也已經定義完成,譬如 plus() 函式,它有三個引數 a、b 和 c,都是 char * 型別。a 和 b 分別是參加運算的兩個整數,而 c 用來存放運算的結果。所有的數字都是以字串的形式儲存的。
注意,只需提交你自己編寫的兩個函式。
輸入的每一行是兩個十進位制的正整數和乙個運算子,每個整數可以由最多 500 個數字組成。運算子可以是加號或者減號。
對應著輸入的每一行資料,輸出計算的結果,每個結果佔一行。
前置**
view plain
print?
/* preset code begin - never touch code below */
#include
#include
void
plus(
char
*a,
char
*b,
char
*c);
void
minus(
char
*a,
char
*b,
char
*c);
intmain()
else
if(s[0] ==
'-')
printf("%s\n"
, c);
} return
0;
} /* preset code end - never touch code above */
測試輸入
期待的輸出
時間限制
記憶體限制
額外程序
測試用例 1
以文字方式顯示
1 + 2↵
3 - 2↵
以文字方式顯示
3↵1↵
1秒64m0
題解思路
大致思路:
我用的思路是,先將a,b兩個字串倒序轉化為整形陣列,然後模擬加減法的豎式計算通過陣列之間的「進製」來將最後的結果存入乙個整形陣列裡面,最後再把這個整形陣列轉化為字元型的陣列。
具體實現方式以及需要注意的事項:
首先預製的函式裡面在輸入中多了「/n」
,這個我們在自己編寫的時候可以先將其去掉,要不然讀入的時候會有問題。
然後就是進行字串的轉化,需要注意的是需要先把字串前面的前導0去掉,借用大神的方法while(a[0]=='0')a++;while(b[0]=='0')b++;這樣就可以吧字串前面的前導0去掉。但是應該注意字串a=「0000」或b=「00000」的這種情況,這種情況下會導致,把字串清空,這裡需要判斷一下,如果經過上面的處理之後字串的長度為0,我們就可以人為的令字串的長度為1,a[0]=0,b[0]=0.然後進行轉化,轉化的時候一般有兩種方法比較容易想到一是在後面-『0』,另一種是在後面-48,不過看發帖說『0』-『0』=『\0』(自己理解是因為兩個字元是一樣的,所以減完之後就是空了),所以還是用第二種方法進行倒序的轉換。這裡對於減法需要注意,為了是最後的『-』比較好處理,所以我們要用大數減去小數,在做轉換的時候,如果a(可以再轉化陣列的時候將大的陣列放進規定的放大數的陣列裡,並做好標記;也可以直接轉化,然後在減的時候用表示大數的陣列減去表示小數的陣列,並做標記)。注意在每次呼叫函式的時候都要將自己定義的三個整形陣列清0.
然後就是計算了,對於加法,按照豎式計算的順序每一位的兩個數相加,相加的結果存入c[i]裡面,如果c[i]>9,則c[i+1]++;c[i]+=10;這樣迴圈著計算(迴圈的長度是兩個陣列裡面最長的陣列的長度),最後計算完了之後要判斷c[length](length表示兩個陣列裡面最長的陣列的長度)是否等於1,即判斷最高位是否有進製,如果有那麼length++。對於減法,思路和加法一樣,按照豎式計算的順序每一位的兩個數相減,相減的結果存入c[i]裡面,如果如果c[i]<0,則c[i+1] - -;c[i]+=10;這樣迴圈著計算(迴圈的長度是兩個陣列裡面最長的陣列的長度),最後計算完了之後要判斷陣列a的前面(length表示兩個陣列裡面最長的陣列的長度)是否有等於0的位,即判斷前面的位是否被借走,剩下0,如果是那麼length--,終止的條件是c[length--]!=0(就是所說的退位)。
最後就是將整形陣列c中的數字轉換為字串,即每個位上的數+48.要注意減法中如果最後的結果是負數的時候要在陣列的前面加『-』,因為最後是『%s』輸出的,所以可以領cc[0]=』-』.還要注意在轉換完成的時候要在字元陣列的最後加上『\0』,這樣可以防止由於陣列沒有初始化而導致輸出亂碼。
實現**
void plus(char *a, char *b, char *c)
while(a[0]=='0')a++;
while(b[0]=='0')b++;
lengtha=strlen(a);
lengthb=strlen(b);
if(lengtha==0&&lengthb!=0)
else if(lengtha!=0&&lengthb==0)
else if(lengtha==0&&lengthb==0)
else if(lengtha>lengthb)
else
for(i=0;i9) //計算
} if(cc[length]>0)
for(j=0;jlengtha)
else
if(temp!=0)
length++;
if(temp==0)
{ for(i=0;i
關於Velocity加減法等四則運算的迷思
曾今有乙個freemarker擺在我面前。我沒有好好珍惜,遇到了velocity我才想起失去的美好.article.hits article.waphits article.mobilehits理想非常美好,現實輸出的是 number number number的乙個大字串 想當年。用freemar...
大整數的四則運算 減法
題目 輸入兩個正整數num1,num2。0在前面的大整數的加法裡已經分析過 大整數的四則運算 加法 所以話不多說,直接上重點。還是對應位之間的運算,但是減法不同於加法,加法具有交換律,所以兩個數哪個在前哪個在後都無所謂。但減法卻不行,所以為了計算,我們首先要知道num1,num2到底哪個大?所以需要...
python四則運算程式 四則運算(Python)
四則運算程式 一 資訊 二.題目要求 寫乙個能自動生成小學四則運算題目的程式,然後在此基礎上擴充套件 除了整數以外,還要支援真分數的四則運算,例如 1 6 1 8 7 24 程式要求能處理使用者的輸入,判斷對錯,累積分數 程式支援可以由使用者自行選擇加 減 乘 除運算 三 import random...