C語言實現(xiàn)高精度的加法
本文實例為大家分享了C語言實現(xiàn)高精度的加法,供大家參考,具體內(nèi)容如下
由鍵盤輸入兩個位數(shù)很長的整數(shù)(一行一個,最多不超過80位),試計算并輸出這兩個數(shù)的和。
輸入樣例
1234567890123456789353534532453453453434534
987654321098765324534534534534532
輸出樣例
1234567891111111110452299856987987987969066
解題思路:
由于一個普通的變量不能保存十多位長的整數(shù),所以通過數(shù)組表示最后的運算結(jié)果,并且每一個下標(biāo)對應(yīng)運算結(jié)果的一位數(shù)。
1、定義兩個字符數(shù)組,分別表示要進行加法運算的兩個數(shù)字。由于在C語言中,沒有專門的字符串變量,沒有string類型,通常就用一個字符數(shù)組來存放一個字符串。此時需要注意的是,下面進行各個數(shù)位的運算的時候,需要將對應(yīng)的字符轉(zhuǎn)成對應(yīng)的數(shù)字。
2、定義一個整形數(shù)組,用來存放運算結(jié)果的各個數(shù)字。同時定義之后,需要將這個數(shù)組進行初始化,將其全部賦值為0。如果沒有進行初始化的話,那么就會容易出錯,讀取對應(yīng)的下標(biāo)的值并不是我們以為的是0。
#include<stdio.h> int main(){ int arr[10];//定義一個長度為10的數(shù)組,并沒有進行初始化 int i; for(i = 0; i < 10; i++) printf("%d ",arr[i]); return 0; }
運算結(jié)果如下圖:
很明顯,這里只是定義一個數(shù)組,讀取元素的值都是垃圾值,并不是我們以為,數(shù)組自己會初始化為0.所以我們需要對數(shù)組進行初始化,從而使得各個數(shù)組的值為0。這里可以通過不完全初始化,即int arr[10] = {0,0},將前2項初始化為0,后面才會自動為0,從而使得各個值都是0,當(dāng)然也可以通過循環(huán)遍歷每一個值,從而對每一個元素賦值為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; }
對應(yīng)的結(jié)果:
3、將上面的兩個字符數(shù)組進行倒序,從而獲得它的逆序。因為我們進行運算的時候首先是計算個位上的,然后才是十位、百位…(獲取對應(yīng)的逆序,類似于證明回文串的用法)
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、從左到右分別遍歷兩個字符數(shù)組,然后進行加法運算。此時需要注意的是將遍歷得到的字符都轉(zhuǎn)成對應(yīng)的整形數(shù)字,然后才可以進行加法運算。同時考慮到他們進行運算之后的和大于等于10的情況,如果大與等于10,那么當(dāng)前的下標(biāo)對應(yīng)的值應(yīng)該是原來的值%10,同時需要進1。
5、遍歷完之后,還需要考慮最高位是否為0的情況,如果高位是0,那么就將這個高位去掉,否則不用去掉。
完整的代碼:
/* 由鍵盤輸入兩個位數(shù)很長的整數(shù)(一行一個,最多不超過80位),試計算并輸出這兩個數(shù)的和。 輸入樣例 1234567890123456789353534532453453453434534 987654321098765324534534534534532 輸出樣例 1234567891111111110452299856987987987969066 */ #include<stdio.h> #include<string.h> #define N 81 void reverse(char num[],int len);//函數(shù)原型聲明 int main(){ char num1[N],num2[N],ch; int num3[100],n1,n2; int len1,len2,max,i; gets(num1); gets(num2);//輸入兩個數(shù)字 //分別統(tǒng)計兩個數(shù)字的長度 len1 = strlen(num1); len2 = strlen(num2); //通過循環(huán)遍歷完全初始化num3,當(dāng)然也可以不完全初始化,后面的值才會自動初始化為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++){ /* 如果這個字符數(shù)組已經(jīng)遍歷完了,那么對應(yīng)的值'\0',自動結(jié)束標(biāo)志, 所以需要將它對應(yīng)的字符賦值為'0',這樣下面減去'0'是得到的數(shù)字才是0,否則 就會出現(xiàn)錯誤 */ if(i >= len2) num2[i] = '0'; if(i >= len1) num1[i] = '0'; n1 = num1[i] - '0';//獲取對應(yīng)的字符的數(shù)字 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--)//從左往右遍歷,從而得到運算結(jié)果 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; } }
對應(yīng)的結(jié)果:
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
詳解C++中構(gòu)造函數(shù),拷貝構(gòu)造函數(shù)和賦值函數(shù)的區(qū)別和實現(xiàn)
這篇文章主要介紹了C++中構(gòu)造函數(shù),拷貝構(gòu)造函數(shù)和賦值函數(shù)的區(qū)別和實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03