效果:

站在用戶的角度思考問題,與客戶深入溝通,找到綏芬河網(wǎng)站設(shè)計(jì)與綏芬河網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗(yàn)好的作品,建站類型包括:做網(wǎng)站、網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、域名注冊、網(wǎng)站空間、企業(yè)郵箱。業(yè)務(wù)覆蓋綏芬河地區(qū)。
代碼:
#includestdio.h
#includestring.h
void?reverse(char?s[])?{
int?len?=?strlen(s),?h?=?len?/?2;
char?temp;
for?(int?i?=?0;?i??h;?++i)?{
temp?=?s[i];
s[i]?=?s[len?-?i?-?1];
s[len?-?i?-?1]?=?temp;
}
}
#define?System?10
#define?MAX?24
const?char?mx?=?'9';
const?char?mn?=?'0';
char*?Sum(char?s1[],?char?s2[])?{
char?ans[MAX];
int?len1?=?strlen(s1),?len2?=?strlen(s2),?ad?=?0,?min?=?len1??len2???len1?:?len2,?max?=?len1len2???len1?:?len2,?i;
char*?st1,?*st2;
if?(len1??len2)?{?st1?=?s2;?st2?=?s1;?}
else?{?st1?=?s1;?st2?=?s2;?}
reverse(st1);
reverse(st2);
for?(i?=?0;?i??min;?i++)?{
ans[i]?=?st1[i]?+?st2[i]?-?'0'?+?ad;
if?(ans[i]??mx)?{
ans[i]?-=?System;
ad?=?1;
}
else?ad?=?0;
}
while?(ad?!=?0?||?i?max)?{
if?(i??max)ans[i]?=?st2[i]?+?ad;
else?ans[i]?=?mn?+?ad;
if?(ans[i]??mx)?{
ans[i]?-=?System;
ad?=?1;
}
else?ad?=?0;
i++;
}
ans[i]?=?'\0';
reverse(ans);
return?ans;
}
int?main()?{
char?A[21],?B[21],?C[50],?*ans;
int?n,?m;
scanf("%d?%d",?m,?n);
scanf("%s?%s",?A,?B);
ans?=?Sum(A,?B);
strcpy(C,?ans);
printf("%s\n",?C);
}
c/c++中int和unsigned類型變量,都不能保存超過10位的整數(shù),但有時我們需要計(jì)算位數(shù)非常長的整數(shù)或小數(shù)的加法。一般我們稱這種基本數(shù)據(jù)類型無法表示的整數(shù)為大整數(shù)。如何表示和存放大整數(shù)呢?基本的思想就是:用數(shù)組存放和表示大整數(shù)。一個數(shù)組元素,存放大整數(shù)中的一位。
現(xiàn)在假如我們要計(jì)算倆個200位數(shù)的加法。顯然,任何C/C++固有類型的變量都無法保存它。最直觀的想法是可以用一個字符串來保存它。字符串本質(zhì)上就是一個字符數(shù)組,因此為了編程更方便,我們也可以用數(shù)組int an[200]來保存一個200 位的整數(shù),讓an[0]存放個位數(shù),an[1]存放十位數(shù),an[2]存放百位數(shù)……那么如何實(shí)現(xiàn)兩個大整數(shù)相加呢?方法很簡單,就是模擬小學(xué)生列豎式做加法,從個位開始逐位相加,超過或達(dá)到10 則進(jìn)位。也就是說,用int?an1[201]保存第一個數(shù),用int an2[200]表示第二個數(shù),然后逐位相加,相加的結(jié)果直接存放在an1 中。要注意處理進(jìn)位。另外,an1 數(shù)組長度定為201,是因?yàn)閮蓚€200 位整數(shù)相加,結(jié)果可能會有201 位。實(shí)際編程時,不一定要費(fèi)心思去把數(shù)組大小定得正好合適,稍微開大點(diǎn)也無所謂,以免不小心沒有算準(zhǔn)這個“正好合適”的數(shù)值,而導(dǎo)致數(shù)組小了,產(chǎn)生越界錯誤。
下面是具體程序:
#includestdio.h
#includestring.h
#defineMAX_LEN?200
int?an1[MAX_LEN+10];
int?an2[MAX_LEN+10];
charszLine1[MAX_LEN+10];
charszLine2[MAX_LEN+10];
int?main(void)
{
scanf("%s",?szLine1);
scanf("%s",?szLine2);
inti,?j;
memset(?an1,?0,?sizeof(an1));
memset(?an2,?0,?sizeof(an2));
int?nLen1?=?strlen(?szLine1);
for(?j?=?0,?i?=?nLen1?-?1;i?=?0?;?i--)
an1[j++]?=?szLine1[i]-?'0';
int?nLen2?=?strlen(szLine2);
for(?j?=?0,?i?=?nLen2?-?1;i?=?0?;?i--)
an2[j++]?=?szLine2[i]-?'0';
for(?i?=?0;i??MAX_LEN?;?i++?)?
{?an1[i]+=?an2[i];//逐位相加
if(?an1[i]?=?10?)?
{?//看是否要進(jìn)位
an1[i]?-=?10;
an1[i+1]?++;?//進(jìn)位
}
}
for(?i?=?MAX_LEN;?(i=?0)??(an1[i]?==?0);?i--?)?;
if(i=0)
for(?;?i?=?0;?i--)
printf("%d",?an1[i]);
else?????printf("0");
return?0;
}
#includestdio.h
#includestring.h
int?Maxlen?;
char?a[110]?,?b[110]?;
int?an1[110]?,?an2[110]?;
int?Addition(int?maxlen?,?int?an1[]?,?int?an2[]?);
int?main()
{
int?i?,?j? ;
scanf("%s"?,?a)?;
scanf("%s"?,?b)?;
memset(?an1?,?0?,?sizeof(an1)?)?;
memset(?an2?,?0?,?sizeof(an2)?)?;
int?len1?=?strlen(a)?;
int?len2?=?strlen(b)?;
if(len1??len2?)
Maxlen?=?len1?;
Maxlen?=?len2?;
for(j?=?0,?i?=?strlen(a)-?1?;?i?=?0?;?i?--)
an1[j++]?=?a[i]?-?'0';
for(j?=?0?,?i?=?len2?-?1?;?i?=?0?;?i?--)
an2[j++]?=?b[i]?-?'0';
Addition?(?Maxlen?,?an1?,?an2?)?;
for(?i?=?100?;?i?=?0;?i?--?)?
{
if(?an1[i]?!=?0?)break;
}
for(;i=0;i--)
printf("%d"?,an1[i])?;
printf("\n")?;
}
int?Addition(?int?maxlen?,?int? an1[]?,?int? an2[]?)//大數(shù)相加函數(shù)
{
for(?int?i?=?0?;?i??maxlen?;?i++?)
{
an1[i]?+=?an2[i]?;
if(?an1[i]?=?10?)?
{
an1[i]?-=?10?;
an1[i?+?1]?++?;
}
}
return?0;
}
#include stdio.h
#include stdlib.h
#define NumLen 1000
typedef struct {
int sign; //符號位
int nLen; //本數(shù)字實(shí)際長度
unsigned short value[NumLen]; //存儲數(shù)值
}BigNumber;
void InitBigNumber(BigNumber * n);
void InputNumber(BigNumber * n);
void OutputBigNumber(BigNumber * n);
void CopyBigNumber(BigNumber * source, BigNumber * target);
void BigNumberPlus(BigNumber * n1, BigNumber * n2, BigNumber * result);
void BigNumberSubtract(BigNumber * n1, BigNumber * n2, BigNumber * result);//n1減n2
void BigNumberMultiply(BigNumber * n1, BigNumber * n2, BigNumber * result);
void BigNumberDivide(BigNumber * n1, BigNumber * n2, BigNumber * result, BigNumber * residue); //n1除以n2
int main()
{
int count,i;
scanf("%d", count);
BigNumber * n1, * n2, * result;
n1 = (BigNumber *)malloc(sizeof(BigNumber));
n2 = (BigNumber *)malloc(sizeof(BigNumber));
result = (BigNumber *)malloc(sizeof(BigNumber));
for(i=1; i=count; i++)
{
InitBigNumber(n1);
InitBigNumber(n2);
InputNumber(n1);
InputNumber(n2);
BigNumberPlus(n1, n2, result);
printf("Case %d:\n", i);
OutputBigNumber(n1);
printf(" + ");
OutputBigNumber(n2);
printf(" = ");
OutputBigNumber(result);
if (i != count)
{
printf("\n\n");
}
else
{
printf("\n");
}
}
}
void InitBigNumber(BigNumber * n){
int i;
n-sign = 1;
n-nLen = 0;
for(i=0; iNumLen; i++)
n-value[i] = 0;
}//end function InitBigNumber
void InputNumber(BigNumber * n){
char num_t[NumLen * 4 + 5];
int i=0,flag = 1;
int j, k = 0,len = 0;
unsigned short tem;
scanf("%s",num_t);
while((num_t[i]!=0)flag){ //查詢有效數(shù)字的長度
if ((i == 0)(num_t[i] == '-')){
n-sign = -1;
i++;
continue;
}//end if
if ((i == 0)(num_t[i] == '+')){
n-sign = 1;
i++;
continue;
}//end if
switch(num_t[i]){
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
len++;
break;
default:
if (i == 0){
printf("輸入有誤!\n");
exit(-1);
}
flag = 0;
break;
}//end switch
i++;
}//end while
if ((num_t[0] == '-')||(num_t[0] == '+')){ //調(diào)整數(shù)據(jù)
for(i=0; ilen; i++)
num_t[i] = num_t[i+1];
}//end if
for(i=len-1; i=0; i--){ //錄入數(shù)據(jù)
tem = num_t[len - i - 1] - '0';
k = i / 4;
j = i % 4;
n-value[k] += tem(j*4);
}//end for
n-nLen = len;
}//end function InputNumber
void OutputBigNumber(BigNumber * n){
int i,k,j;
unsigned short tem;
int flag = 0;
if (n-sign == -1) printf("-");
for(i=n-nLen-1; i=0; i--){
k = i / 4;
j = i % 4;
tem = (n-value[k](j*4)) % 0x10;
if (tem !=0) flag = 1;
while(flag){
printf("%c", tem + '0');
break;
}
}//end for
if (flag == 0 ) printf("0");
}//end function OutputBigNumber
void BigNumberPlus(BigNumber * n1, BigNumber * n2, BigNumber * result){
int i,j;
unsigned short FlagCarry=0; //進(jìn)位標(biāo)志
unsigned short temByteA, temByteB;
unsigned short temBitA, temBitB;
unsigned temSum;
int length;
InitBigNumber(result);
if (n1-sign == n2-sign){
length = (n1-nLen) (n2-nLen) ? n1-nLen : n2-nLen;
for(i=0; i length; i++){ //處理
temByteA = n1-value[i]; temByteB = n2-value[i];
for(j=0; j4; j++){
temBitA = temByteA % 0x10;
temBitB = temByteB % 0x10;
temByteA /= 0x10;
temByteB /= 0x10;
temSum = FlagCarry + temBitA + temBitB;
FlagCarry = temSum / 10;
result-value[i] += (temSum % 10)(j*4);
}//end for j
}//end for i
result-value[length] = FlagCarry;
result-nLen = length + 1;
result-sign = n1-sign;
}//end if
else{
if (n1-sign == -1 ){
n1-sign = 1;
BigNumberSubtract(n2,n1,result);
n1-sign = -1;
}
else{
n2-sign = 1;
BigNumberSubtract(n1,n2,result);
n2-sign = -1;
}//end inner if-else
}//end outer if-else
}//end function BigNumberPlus
void BigNumberSubtract(BigNumber * n1, BigNumber * n2, BigNumber * result){
int i,j;
unsigned short FlagBorrow = 0; //借位標(biāo)志
unsigned short temByteA, temByteB;
unsigned short temBitA, temBitB;
unsigned short temDifference;
int length;
InitBigNumber(result);
if (n1-sign != n2-sign ){
n2-sign *= -1;
BigNumberPlus(n1,n2,result);
n2-sign *= -1;
}
else{
if (n2-sign == -1){
n2-sign = 1;
BigNumberPlus(n1,n2,result);
n2-sign = -1;
}
else{
if (n2-sign == -1){
n2-sign = 1;
BigNumberPlus(n1,n2,result);
n2-sign = -1;
}
else{
length = (n1-nLen) (n2-nLen) ? n1-nLen : n2-nLen;
for(i=0; i length; i++){ //處理
temByteA = n1-value[i]; temByteB = n2-value[i];
for(j=0; j4; j++){
temBitA = temByteA % 0x10;
temBitB = temByteB % 0x10;
temByteA /= 0x10;
temByteB /= 0x10;
if (temBitA - temBitB - FlagBorrow 0){
temDifference = temBitA - temBitB - FlagBorrow +10;
FlagBorrow = 1;
}
else{
temDifference = temBitA - temBitB - FlagBorrow;
FlagBorrow = 0;
}//end if-else
result-value[i] += (temDifference % 10)(j*4);
}//end for j
}//end for i
result-nLen = length;
if (temByteA FlagBorrow){
InitBigNumber(result);
result-sign = -1;
FlagBorrow = 0;
for(i=0; i length; i++){ //重新處理
temByteA = n2-value[i]; temByteB = n1-value[i];
for(j=0; j4; j++){
temBitA = temByteA % 0x10;
temBitB = temByteB % 0x10;
temByteA /= 0x10;
temByteB /= 0x10;
if (temBitA - temBitB - FlagBorrow 0){
temDifference = temBitA - temBitB - FlagBorrow +10;
FlagBorrow = 1;
}
else{
temDifference = temBitA - temBitB - FlagBorrow;
FlagBorrow = 0;
}//end if-else
result-value[i] += (temDifference % 10)(j*4);
}//end for j
}//end for i
result-nLen = length;
}//end if
}//end inner if-else
}//end middle if-else
}//end outer if-else
}//end function BigNumberSubtract
做大數(shù)加法,首先要能保存大整數(shù)。C能提供的最大的整數(shù)類型也就是long long int了吧,還是有上限。用整數(shù)類型這條路不通。所以想到把大整數(shù)看作字符串(即char數(shù)組),一位數(shù)字就是數(shù)組的一個元素。數(shù)組能有多長?幾萬位不止,應(yīng)付大數(shù)加法很輕松。
基本做法就是把兩個加數(shù)各自存為字符串。(怎么把數(shù)字轉(zhuǎn)換成字符?每個數(shù)字加'0'就行了。比如 '7'就是7+'0'。)然后從個位起逐位加。(加的時候把字符變回?cái)?shù)字,'7'-'0'就是7。)算出來的結(jié)果再轉(zhuǎn)成字符存到第三個數(shù)組的相應(yīng)位里,遇到進(jìn)位就把上一位加個1,簡單的很。最后第三個字符串就是結(jié)果,用puts打印出來就行了。做的時候?yàn)榱朔奖憧赡軙褌€位存在數(shù)組第一位,那樣的話就倒序輸出字符串就行了。
代碼自己寫。
用高精度算法來實(shí)現(xiàn),即用數(shù)組或指針來儲存數(shù)字,例如A〔20〕來儲存a ,用B〔20〕來儲存b,這樣a 和b就可以是很大的數(shù),再用一個C〔21〕來儲存結(jié)果,為什么C要21呢,你知道,加法是要近位的,呵呵。這里給出相加的偽代碼,d =0/*用來存儲近位*/,for i=0到19{c=A〔i〕+B〔i〕+d ,d =c/10,c=c%10,C〔i〕=c}if d 不等于0 C〔i+1〕=d ,再逆的輸出C就可以了!編程要學(xué)會思考,現(xiàn)在你可以試試編下高精度乘法,例如可以輸出100的階乘!
網(wǎng)頁標(biāo)題:c語言大數(shù)加法指針函數(shù),大數(shù)加減法c語言
網(wǎng)頁URL:http://chinadenli.net/article44/dsipohe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站建設(shè)、全網(wǎng)營銷推廣、小程序開發(fā)、品牌網(wǎng)站設(shè)計(jì)、Google、動態(tài)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)