2010年3月1日 星期一

2010/03/01大數運算

在大多數的程式語言中,一個整數通常只有32位元,就算是使
用無號的整數,仍然最大只能表示232-1。若要表示一個大於232-1的
整數該怎麼辦呢?答案就是採用大數。本題要求寫出一個大數運算的
程式,可以對二個50位數以內的10進制非負整數作乘法或除法的運
算。除法運算時,毋須考慮除數為0的情形,並僅需算出商數。

輸入說明 :
第一行輸入一個字串,表示被乘數或被除數,其為一個50位數
以內的10進制非負整數。

第二行輸入運算符號 * 或 /,分別表示乘法或除法運算。

第三行輸入一個字串,表示乘數或除數,其為一個50位數以內

的10進制非負整數。當執行除法運算時,除數為正整數。

輸出說明 :
印出運算結果。

範例輸入 :
若題目沒有特別說明,則應該以多測資的方式讀取,若不知如何讀取請參考 a001 的範例程式。
12346587987654321
*
98765432123456789

12345678901234567890
/
1234567890

範例輸出 :
1219416097850959788293446112635269

10000000001

6 則留言:

  1. 大數問題,是個常見的程式思考題。
    1.先從加法吧。
    2.然後,再試減法。
    3.再來,才試乘法。
    4.除法,應該是最后做的。
    每個人,可以將這題分成四題做。
    哦,你們試做的時候,請就習慣用「文字檔案」的方式輸出,養成習慣,不然,比賽時一緊張,就有可能忘了改回來。(已經有兩個這樣的例子了吧。)

    回覆刪除
  2. 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

    這是加法

    回覆刪除
  3. 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
    加法

    回覆刪除
  4. 阿瑋好,
    你這題大數加法
    1.沒處理y,至少要做個樣子,說那個是y="+"
    2.n和m那個大呢? 當兩個數長度不一樣時,加法的後段,還要處理。
    3.你還是用print ans,還是沒習慣用在文字檔。
    (所以,你這題,算是錯的。)

    Y揚好,
    1.你的num(3)只能存一次的題目,那麼用do until eof(1)做啥? (所以,這是錯的)
    2.除了1之外,你的程式,應該是對的加法。
    3.還是再說一次,如果你將輸入和輸出,也一同貼出來, 一看就會清楚了吧。

    回覆刪除
  5. 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


    這是加法

    回覆刪除
  6. 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

    回覆刪除