大数系列之大数相加(ACM通过)(一)
生活随笔
收集整理的這篇文章主要介紹了
大数系列之大数相加(ACM通过)(一)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
大數相加
概述:本題主要解決HDU 1002的大數相加問題并且成功AC
主要思路
1:定義兩個字符數組和兩個int型數組,輸入字符串數組
2:將兩個字符數組的長度用’0’補到一樣長
3:倒著存入int型數組(方便計算~),
如:原來在字符數組里:123 56
存入后:3210 6500(這里多一個0的原因是兩個數相加可能溢出一位)
4:從前往后逐位運算(模擬手算過程), 最后倒著輸出(因為是倒著輸入的)
代碼實現
#include<iostream> #include<string> #include<algorithm> #include<string.h>using namespace std ;int main () {char a[1000] , b[1000] ;int a_int[1001] , b_int[1001] ;//int型最大位數要多一位,防止運算時溢出int t , a_len , b_len , max_len ;//定義數組長度cin >> t ;for ( int i = 1 ; i <= t ; i ++ ) {cin >> a >> b ; //cin可以直接輸入char數組。a_len = strlen(a) ;b_len = strlen(b) ;int tmp = 0 ; //存入整型數組for ( int j = a_len - 1 ; j >=0 ; j -- )//反向存入a_int[]a_int[tmp++] = a[j] - '0' ; tmp = 0 ;for ( int k = b_len-1 ; k >= 0 ; k -- )//反向存入b_int[]b_int[tmp++] = b[k] - '0' ; //判斷a_int[]和b_int[]哪個大,小的填充0if ( a_len > b_len ){for ( int j = b_len ; j <= a_len ; j ++ ) {b_int[j] = 0 ;}a_int[a_len] = 0 ;//第n+1位置0 } else if ( a_len < b_len) {for ( int j = a_len ; j <= b_len ; j ++ ) {a_int[j] = 0 ;}b_int[b_len] = 0 ;} else {//如果一樣大,則都在前面添一個0,防止運算時溢出a_int[a_len] = 0 ;b_int[b_len] = 0 ;}max_len = max( a_len , b_len ) ;//求和for ( int j = 0 ; j <= max_len ; j ++ ) {a_int[j] += b_int[j] ;if ( a_int[j] >= 10 ){a_int[j] -= 10 ;a_int[j+1] += 1 ;}} //以下是按照ACM方式輸出的,讀者可以作適當更改,cout << "Case " << i << ':' << endl ;cout << a << " + " << b << " = " ;//判斷最高位是否有進位,有就輸出if ( a_int[max_len] == 0 )//因為倒序存放,所以倒序輸出for ( int j = max_len-1;j>=0;j--) cout << a_int[j] ;else{for ( int j=max_len;j>=0;j--)cout << a_int[j] ;} if ( i != t )cout << endl << endl ;else cout << endl ; } return 0 ;}注
結果是按照ACM題的方式輸出的 , 讀者可參考杭電 HDU1002嘗試AC,(小聲嗶嗶:能通過ACM的代碼才是好代碼~~,筆者之前嘗試了N個小時數種方法,只有這個代碼能AC。)
千里之行始于足下,望耐心理解,期望大家都有所收獲
總結
以上是生活随笔為你收集整理的大数系列之大数相加(ACM通过)(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++万能头文件#include“bit
- 下一篇: 浅谈万进制算法与大数定理的结合(高精度乘