【算法】 藍橋杯 高精度加法

問題描述 
  輸入兩個整數a和b,輸出這兩個整數的和。a和b都不超過100位。 算法

算法描述數組

  因爲a和b都比較大,因此不能直接使用語言中的標準數據類型來存儲。對於這種問題,通常使用數組來處理。定義一個數組A,A[0]用於存儲a的個位,A[1]用於存儲a的十位,依此類推。一樣能夠用一個數組B來存儲b。計算c = a + b的時候,首先將A[0]與B[0]相加,若是有進位產生,則把進位(即和的十位數)存入r,把和的個位數存入C[0],即C[0]等於(A[0]+B[0])%10。而後計算A[1]與B[1]相加,這時還應將低位進上來的值r也加起來,即C[1]應該是A[1]、B[1]和r三個數的和.若是又有進位產生,則仍可將新的進位存入到r中,和的個位存到C[1]中。依此類推,便可求出C的全部位。函數

最後將C輸出便可。 spa

輸入格式 
  輸入包括兩行,第一行爲一個非負整數a,第二行爲一個非負整數b。兩個整數都不超過100位,兩數的最高位都不是0。code

輸出格式 
  輸出一行,表示a + b的值。 blog

樣例輸入 
20100122201001221234567890 2010012220100122字符串

樣例輸出 
20100122203011233454668012string

 

本題目遇到的問題:io

(1).對於輸入的格式沒有空格,是直接以字符串的形式輸入的,要怎麼樣記錄該字符串的長度呢class

  最開始是用的scanf,可是沒有空格的話會被當作一個數字,而不是數組的形式

  改爲%s以後不知道該如何記錄兩個數組的長度,由於strlen函數不適用與整數型的字符串,而且也不能用\n做爲計數條件進行計算

  而後想到既然用strlen能夠的話,爲何不直接改爲字符串數組呢,嗯。。就改爲字符串數組:改了以後須要注意的是數組中的每一個元素都要-'0'來獲取到真正的數值,否則就是ASCII碼

(2)對於計算的時候是兩個數組是從後面對齊相加的,那麼就須要從兩個數組的最後開始加

  我開始想的是把輸入的數組先翻轉一下從0開始加而後再翻轉

  可是在知道兩個數組長度的狀況下就能夠用for()從最後開始循環到最前面

(3)對於輸出的時候,由於把每一個位數該是多少賦值給了C數組,而且也是從個位開始賦值給C中的下標爲0的元素的,而後最開始給C數組用memset函數將數組初始化爲0

  咱們從C的最後面往前面找,找 到第一個不爲0的數的時候就記錄下來下標,這樣就能夠從n開始向前面輸出(而且在這裏不會致使3200000,這種沒辦法輸出,由於低位數是在前面,

  後面的是高位數,應 該從第一個不爲0的高位數開始輸出)

具體的代碼:

#include<stdio.h>
#include<string.h>
#define MAX 110 
int main()
{
    char A[MAX];//由於整形計算不了字符串的長度,不知足要求的輸入格式,因此改爲字符型 
    char B[MAX];
    char C[MAX];
    int i;
    int j;
    int k=0;
    int r=0;
    int s;
    int n;
    int maxA,maxB; 
    //由於A和B已經輸入了因此不用所有賦值爲0了 
    memset(C,0,sizeof(C));
    //先按照正常的順序存進去,再調換位置 
    scanf("%s%s",A,B);//兩個字符串數組能夠一塊兒存入 
    maxA=strlen(A);
    maxB=strlen(B); 
    //由於已經能夠得出當前A和B的最後一位的位置,因此不用再反轉數組 
     
    //當前記錄的是位數都存在的時候,對應相加 
    for(i=maxA-1,j=maxB-1; i>=0&&j>=0; i--,j--)
    {
        s=(A[i]-'0')+(B[j]-'0')+r; 
        r=s/10;//進位 
        C[k]=s%10;//留在原位的數字 
        k++;
    }
    
    //當某一個長度大於另一個長度的時候分類討論
    if(maxA>maxB)
    {
        for(;i>=0;i--)
        {
            s=A[i]-'0'+r;
            r=s/10;//進位 
            C[k]=s%10;
            k++;
        }
     }
     else if(maxA<maxB)
     {
         for(;j>=0;j--)
         {
             s=B[i]-'0'+r;
             r=s/10;//進位 
            C[k]=s%10;
            k++;
         }
      }
      else
      {
          C[k]=r;//若是是處在兩個都沒有到盡頭的時候,就是將最高位加了要進位的在前面加一位用須要進位的r進行保存 
          k++;
       } 
    //反着輸出,記錄第一個C中不爲0的下標 
    for(i=MAX-1; i>=0; i--)
    {
        if(C[i]!=0)
        {
            break;
            n=i;
        }
     }
     for(j=i; j>=0; j--)
     {
         printf("%d",C[j]);
      } 
 } 
 
相關文章
相關標籤/搜索