在大多數的程式語言中,一個整數通常只有32位元,就算是使
用無號的整數,仍然最大只能表示232-1。若要表示一個大於232-1的
整數該怎麼辦呢?答案就是採用大數。本題要求寫出一個大數運算的
程式,可以對二個50位數以內的10進制非負整數作乘法或除法的運
算。除法運算時,毋須考慮除數為0的情形,並僅需算出商數。
輸入說明 :
第一行輸入一個字串,表示被乘數或被除數,其為一個50位數
以內的10進制非負整數。
第二行輸入運算符號 * 或 /,分別表示乘法或除法運算。
第三行輸入一個字串,表示乘數或除數,其為一個50位數以內
的10進制非負整數。當執行除法運算時,除數為正整數。
輸出說明 :
印出運算結果。
範例輸入 :
若題目沒有特別說明,則應該以多測資的方式讀取,若不知如何讀取請參考 a001 的範例程式。
12346587987654321
*
98765432123456789
12345678901234567890
/
1234567890
範例輸出 :
1219416097850959788293446112635269
10000000001
大數問題,是個常見的程式思考題。
回覆刪除1.先從加法吧。
2.然後,再試減法。
3.再來,才試乘法。
4.除法,應該是最后做的。
每個人,可以將這題分成四題做。
哦,你們試做的時候,請就習慣用「文字檔案」的方式輸出,養成習慣,不然,比賽時一緊張,就有可能忘了改回來。(已經有兩個這樣的例子了吧。)
Dim qq(50), qw(50), qe(50), q As Integer
回覆刪除Private Sub Form_Load()
Open App.Path & "\in.txt" For Input As #1
Open App.Path & "\out.txt" For Output As #2
Input #1, x, y, z
n = Len(x): m = Len(z)
For i = 1 To n
qq(i) = Val(Mid(x, n - i + 1, 1))
Next i
For j = 1 To m
qw(j) = Val(Mid(z, m - j + 1, 1))
Next j
q = 0
For i = 1 To n + 1
qe(i) = (qq(i) + qw(i) + q) Mod 10
q = (qq(i) + qw(i) + q) \ 10
Next i
For i = 1 To n + 1
ans = qe(i) & ans
Next i
If qe(n + 1) <> 0 Then
Print ans
Else
Print Right(ans, Len(ans) - 1)
End If
Close #1
Close #2
End Sub
這是加法
Private Sub Form_Load()
回覆刪除Dim num(3) As String
Dim up(50), down(50), ans(50) As Integer
Open App.Path & "\in.txt" For Input As #1
Open App.Path & "\out.txt" For Output As #2
i = 1
Do Until EOF(1)
Line Input #1, num(i)
i = i + 1
Loop
If Len(num(1)) > Len(num(3)) Then
Max = Len(num(1))
Else
Max = Len(num(3))
End If
For i = 1 To Len(num(1))
up(i) = Val(Mid(num(1), i, 1))
Next i
For i = 1 To Len(num(3))
down(i) = Val(Mid(num(3), i, 1))
Next i
For i = Max To 0 Step -1
q = (up(i) + down(i) + over)
ans(i) = q Mod 10
over = q \ 10
Next i
If ans(0) <> 0 Then Print ans(0);
For i = 1 To Max
Print ans(i);
Next i
Close #1
Close #2
End Sub
加法
阿瑋好,
回覆刪除你這題大數加法
1.沒處理y,至少要做個樣子,說那個是y="+"
2.n和m那個大呢? 當兩個數長度不一樣時,加法的後段,還要處理。
3.你還是用print ans,還是沒習慣用在文字檔。
(所以,你這題,算是錯的。)
Y揚好,
1.你的num(3)只能存一次的題目,那麼用do until eof(1)做啥? (所以,這是錯的)
2.除了1之外,你的程式,應該是對的加法。
3.還是再說一次,如果你將輸入和輸出,也一同貼出來, 一看就會清楚了吧。
Dim a(50) As Integer, b(50) As Integer, c(50) As Integer
回覆刪除Private Sub Form_Load()
Open App.Path & "/in.txt" For Input As #1
Open App.Path & "/out.txt" For Output As #2
Line Input #1, strA
Input #1, strC
Line Input #1, strB
For i = 1 To Len(strA)
a(i) = Val(Mid(strA, Len(strA) - i + 1, 1))
Next i
For i = 1 To Len(strB)
b(i) = Val(Mid(strB, Len(strB) - i + 1, 1))
Next i
Max = Len(strA)
If Len(strB) > Max Then Max = Len(strB)
For i = 1 To Max
c(i) = a(i) + b(i)
If c(i) >= 10 Then c(i + 1) = c(i) \ 10: c(i) = c(i) Mod 10: t = i + 1
Next i
For i = t To 1 Step -1
ans = ans & c(i)
Next i
Print ans
End Sub
這是加法
Dim a(50) As Integer, b(50) As Integer, c(51) As Integer
回覆刪除Private Sub Form_Load()
Open App.Path & "/in.txt" For Input As #1
Open App.Path & "/out.txt" For Output As #2
Line Input #1, strA
Input #1, strC
Line Input #1, strB
For i = 1 To Len(strA)
a(i) = Val(Mid(strA, Len(strA) - i + 1, 1))
Next i
For i = 1 To Len(strB)
b(i) = Val(Mid(strB, Len(strB) - i + 1, 1))
Next i
Max = Len(strA)
If Len(strB) > Max Then Max = Len(strB)
Bigger = 1
If a(Max) < b(Max) Then
Bigger = 2
ElseIf a(Max) = b(Max) Then
For i = Max To 1 Step -1
If a(i) < b(i) Then
Bigger = 2
GoTo isCO
End If
Next i
End If
isCO:
For i = Max To 1 Step -1
If Bigger = 1 Then
c(i) = a(i) - b(i)
If c(i) < 0 Then c(i + 1) = c(i + 1) - 1: c(i) = c(i) + 10
Else
c(i) = b(i) - a(i)
If c(i) < 0 Then c(i + 1) = c(i + 1) - 1: c(i) = c(i) + 10
End If
Next i
For i = UBound(c) To 1 Step -1
If c(i) <> 0 Then
t = i: GoTo isEND
End If
Next i
isEND:
Do
isWr:
For i = 1 To t - 1
If c(i) < 0 Then c(i + 1) = c(i + 1) - 1: c(i) = c(i) + 10: GoTo isWr
Next i
Exit Do
Loop
If Bigger = 2 Then
c(Max) = c(Max) * -1
End If
For i = t To 1 Step -1
ans = ans & c(i)
Next i
Print #2, ans
End Sub
這是減法
input sample:
12345678987654321
98765432123456789
output:
-86419753135802468