C語言實現高精度的加法

本文實例為大傢分享瞭C語言實現高精度的加法,供大傢參考,具體內容如下

由鍵盤輸入兩個位數很長的整數(一行一個,最多不超過80位),試計算並輸出這兩個數的和。

輸入樣例

1234567890123456789353534532453453453434534
987654321098765324534534534534532

輸出樣例

1234567891111111110452299856987987987969066

解題思路:

由於一個普通的變量不能保存十多位長的整數,所以通過數組表示最後的運算結果,並且每一個下標對應運算結果的一位數。
1、定義兩個字符數組,分別表示要進行加法運算的兩個數字。由於在C語言中,沒有專門的字符串變量,沒有string類型,通常就用一個字符數組來存放一個字符串。此時需要註意的是,下面進行各個數位的運算的時候,需要將對應的字符轉成對應的數字。
2、定義一個整形數組,用來存放運算結果的各個數字。同時定義之後,需要將這個數組進行初始化,將其全部賦值為0。如果沒有進行初始化的話,那麼就會容易出錯,讀取對應的下標的值並不是我們以為的是0。

#include<stdio.h>
int main(){
  int arr[10];//定義一個長度為10的數組,並沒有進行初始化
  int i;
  for(i = 0; i < 10; i++)
    printf("%d ",arr[i]);
  return 0;
}

運算結果如下圖:

很明顯,這裡隻是定義一個數組,讀取元素的值都是垃圾值,並不是我們以為,數組自己會初始化為0.所以我們需要對數組進行初始化,從而使得各個數組的值為0。這裡可以通過不完全初始化,即int arr[10] = {0,0},將前2項初始化為0,後面才會自動為0,從而使得各個值都是0,當然也可以通過循環遍歷每一個值,從而對每一個元素賦值為0,從而使得每一個元素的初始值為0。

#include<stdio.h>
int main(){
  int arr[10] = {0};//不完全初始化,將第一項初始化為0,後面的自動初始化為0
  int i;
  for(i = 0; i < 10; i++)
    printf("%d ",arr[i]);
  return 0;
}

對應的結果:

3、將上面的兩個字符數組進行倒序,從而獲得它的逆序。因為我們進行運算的時候首先是計算個位上的,然後才是十位、百位…(獲取對應的逆序,類似於證明回文串的用法)

void reverse(char num[],int len){
  int i;
  char ch;
  for(i = 0; i < len/2; i++){
    ch = num[i];
    num[i] = num[len - 1 -i];
    num[len - i - 1] = ch;
  }
}

4、從左到右分別遍歷兩個字符數組,然後進行加法運算。此時需要註意的是將遍歷得到的字符都轉成對應的整形數字,然後才可以進行加法運算。同時考慮到他們進行運算之後的和大於等於10的情況,如果大與等於10,那麼當前的下標對應的值應該是原來的值%10,同時需要進1。
5、遍歷完之後,還需要考慮最高位是否為0的情況,如果高位是0,那麼就將這個高位去掉,否則不用去掉。

完整的代碼:

/*
由鍵盤輸入兩個位數很長的整數(一行一個,最多不超過80位),試計算並輸出這兩個數的和。
輸入樣例
1234567890123456789353534532453453453434534
987654321098765324534534534534532

輸出樣例
1234567891111111110452299856987987987969066
*/
#include<stdio.h>
#include<string.h>
#define N 81
void reverse(char num[],int len);//函數原型聲明
int main(){
  char num1[N],num2[N],ch;
  int num3[100],n1,n2;
  int len1,len2,max,i;
  gets(num1);
  gets(num2);//輸入兩個數字
  //分別統計兩個數字的長度
  len1 = strlen(num1);
  len2 = strlen(num2);
  //通過循環遍歷完全初始化num3,當然也可以不完全初始化,後面的值才會自動初始化為0
  for(i = 0; i < N * 2; i++){
    num3[i] = 0;
  }
  max = len1 > len2? len1 : len2;//獲取兩個字符串中最大長度
  //獲取字符串的倒序
  reverse(num1,len1);
  reverse(num2,len2);
  //進行高精度的運算
  for(i = 0; i < max; i++){
  /*
  如果這個字符數組已經遍歷完瞭,那麼對應的值'\0',自動結束標志,
  所以需要將它對應的字符賦值為'0',這樣下面減去'0'是得到的數字才是0,否則
  就會出現錯誤
  */
    if(i >= len2)
        num2[i] = '0';
    if(i >= len1)
        num1[i] = '0';
    n1 = num1[i] - '0';//獲取對應的字符的數字
    n2 = num2[i] - '0';
    num3[i] += n1 + n2;
    num3[i + 1] = num3[i] / 10;//表示進位
    num3[i] = num3[i] % 10;//考慮到進行加法運算後他們的和大於10的情況,所以這裡是%10
  }
  if(num3[i] == 0)//去除高位
    i--;
  for(; i>=0;i--)//從左往右遍歷,從而得到運算結果
    printf("%d",num3[i]);
  return 0;
}
//獲得字符的逆序
void reverse(char num[],int len){
  int i;
  char ch;
  for(i = 0; i < len/2; i++){
    ch = num[i];
    num[i] = num[len - 1 -i];
    num[len - i - 1] = ch;
  }
}

對應的結果:

以上就是本文的全部內容,希望對大傢的學習有所幫助,也希望大傢多多支持WalkonNet。

推薦閱讀: