大數的加減乘除

2021-07-07 05:10:27 字數 3487 閱讀 9656

最基本的乙個運算,可以用陣列或指標做

一.加法

1.自己的**,真是一點都不簡潔,水平有限啊!

#include

#include

int max(int len1, int len2)

int main()

for (int i = 0; i < len1 - len2; i++)

s2[i] = '0';

}if (len1 < len2)

for (int i = 0; i < len2 - len1;i++)

s1[i] = '0';

}int n = max(len1, len2) - 1;

s[n] = (s1[n] + s2[n]-96)%10;

for (int i = n-1; i >= 0; i--)

for (int i = 0; i <= n; i++)

printf("%d", s[i]);

printf("\n");

return

0;}

2.網上的**(poj1503)

可以計算多個相加並且簡潔,膜拜

#include 

#include

#include

char s[101];

intsum[101];

int main()

}j=101-1; //這裡要-1,否則後面sum[j]陣列越界

while(!sum[j]) --j; //重新賦值j 使j為目前sum的總位數

for (i=0;i//如果sum[i]加成兩位數 將十位數加給前一位數

sum[i+1]+=sum[i]/10;

sum[i]=sum[i]%10;

}for (i=j; i>=0; --i)

printf("\n");

return

0;}

二.減法

1.自己寫的**

還是寫的又臭又長,無奈,**水平有限,不過應該可以改進,懶得弄了

#include

#include

char s1[100], s2[100];

int a[100] = , b[100] = ;

int sum[200] = ;

//分開來討論,都先較大數減較小數

void more(int n1, int n2)//第乙個數長度大於第二個數

else

sum[i] = a[i] - b[i];

}for (int i = n1 - 1; i >= 0; i--)

printf("%d", sum[i]);

printf("\n");

}void less(int n1, int n2)//第乙個數長度小於第二個數

else

sum[i] = b[i] - a[i];

}printf("-"); //前面加乙個負號

for (int i = n2 - 1; i >= 0; i--)

printf("%d", sum[i]);

printf("\n");

}int main()

return

0;

}

看了一下網上的**好像也沒有特別簡潔的,感覺我這寫的也不錯了

三:乘法

要點:

1.乘法中有個規則:假如結果的下標為m

sum[m]=a[0]*b[m]+a[1]*b[m-1]+a[2]*b[m-2]……a[m]*b[0]

2.先將所有的數加到一起得到所有的sum[m],再對sum進行進製操作

即跟上面大數的加法的大神**思路一致

第一點我想到了,然而第二點沒想到,做半天做不出,無奈,**轉換能力太差

下面的**是在網上的**的基礎上改的,原先的有點小錯誤

#include

#include

int main()

else

//確保ans2位數比ans1小

if (len1 < len2)//確保len2是比較小的數,這樣好理清思路

for (i = 0; i < len2; i++) //這裡牽涉到一些數學知識如上

for (j = 0; j < len1; j++)

ans[i+j] = ans[i+j] % 10;

}if(ans[len1+len2-1]!=0) //判斷最前面的那個是否為0,為0則跳過

printf("%d",ans[len1+len2-1]);

for (i = len1+len2 - 2; i >= 0; i--)

printf("\n");

return

0;}

學了一年了,現在可以用c++的類來實現這個問題,感覺還是有挺大進步的。

#include

#include

#include

#include

#include

#include

using

namespace

std;

class bignumber

bignumber operator=(long

long num)

while (num > 0);

return *this;

}bignumber operator=(const

string &str)

return *this;

}friend ostream & operator

<<(ostream &os, const bignumber &x)

friend istream & operator >> (istream &is, bignumber &x)

//四則運算

bignumber operator+(const bignumber &b) const

return c;

}//比較運算

bool

operator

<(const bignumber &b) const

return

false;//相等

}bool

operator>(const bignumber &b) const

bool

operator

<=(const bignumber &b) const

bool

operator>=(const bignumber &b) const

bool

operator!=(const bignumber &b) const

bool

operator==(const bignumber &b) const

};int main()

return

0;}

大數加減乘除

include include include include includeusing namespace std compare比較函式 相等返回0,大於返回1,小於返回 1 int compare string str1,string str2 if cf 0 str char cf 0 st...

大數加減乘除

對於大數的加減乘除都要先把輸入的大數字串轉成倒序的陣列,再進行運算。字串的處理 scanf s s a1,b1 len 0 for int i strlen a1 1 i 0 i len 0 for int i strlen b1 1 i 0 i len max strlen a1 strlen b...

大數的加減乘除

當數的位數非常大而常規的資料型別不足以儲存的時候,可以考慮使用大數。即用乙個長的陣列來儲存相應的位數,如int a 100 a的每一位儲存一位數字或幾位數字,根據常規的加減乘除運算對陣列進行操作。使用string型別對陣列進行操作,雖然比用整型簡便,但可 能增加了執行時間。pku1001 expon...