大整数加法
1.java
public class sum{
public static void main(){
Scanner cin = new Scanner(System.in);
while(cin.hasNext()){
BigInteger a = cin.BigInteger();
BigInteger b = cin.BigInteger();
BigInteger s = a+b;
System.out.println(s);
}
}
}
2.c++数组模拟
int main()
{
vector<int> a(1000,0);
vector<int> b(1000,0);
string s1, s2;
while (cin >> s1 >> s2) {
int len = max(s1.size(), s2.size());
vector<int> res(len+1);
vector<int> carry(len + 1,0);
//反序将字符串转化为数字存入数组
for (int i = s1.size()-1, j = 0; i >= 0; --i, j++) {
a[j] = s1[i]-'0';
}
for (int i = s2.size()-1, j = 0; i >= 0; --i, j++) {
b[j] = s2[i]-'0';
}
for (int i = 0; i < len; ++i) {
int sum = a[i] + b[i] + carry[i];
res[i] = sum % 10;
carry[i+1] = sum / 10;
}
res[len] = carry[len];
if (carry[len] == 1) {
res[len] = carry[len];
}
else {
len--;
}
for (int i = len; i >= 0; --i) {
cout << res[i];
}
}
}
不用进位数组的写法:
int main()
{
vector<int> a(1000,0);
vector<int> b(1000,0);
string s1, s2;
while (cin >> s1 >> s2) {
int len = max(s1.size(), s2.size());
vector<int> res(len+1);
//反序将字符串转化为数字存入数组
for (int i = s1.size()-1, j = 0; i >= 0; --i, j++) {
a[j] = s1[i]-'0';
}
for (int i = s2.size()-1, j = 0; i >= 0; --i, j++) {
b[j] = s2[i]-'0';
}
for (int i = 0; i < len; ++i) {
res[i] += a[i] + b[i];
res[i + 1] = res[i] / 10;
res[i] = res[i] % 10;
}
if (res[len] == 0) {
len--;
}
for (int i = len; i >= 0; --i) {
cout << res[i];
}
}
}
大整数乘法
- python
a = input()
b = input()
print(int(a)*int(b))
- 数组模拟乘法
#include <iostream>
#include <string>
#include <cstring>
#include <algorithm>
using namespace std;
int a[2005],b[2005],c[4005]; // 全局变量,自动初始化为0
// 数组模拟乘法
string multi(int a[],int b[],int lena,int lenb){
// 在这里不能使用sizeof()获取数组的长度:因为这里函数形参a是数组的地址(或指针),而不是传给整个的数组空间;指针的大小为 4字节(32位)或 8字节(64位)
// 函数不可能只依靠一个首地址就知道你传进来的数组长度,要再传一个参数作为数组长度
// cout<<sizeof(a);
for(int i = 0;i < lenb; ++i){
for(int j = 0; j < lena; ++j){
c[i+j] += a[j]*b[i];
}
}
for(int i=0;i<lena+lenb;++i){
if(c[i]>9){
c[i+1] += c[i]/10;
c[i] = c[i]%10;
}
}
int len = lena+lenb;
while(c[len]==0 && len>0){
len--;
}
string res="";
for(int i = len;i>=0;--i){
res+=c[i]+'0';
}
return res;
}
int main(){
string s1,s2;
cin>>s1>>s2;
// 逆序存储
for(int i=s1.size()-1, j=0; i>=0; --i,++j){
a[j] = s1[i]-'0';
}
for(int i=s2.size()-1, j=0; i>=0; --i,++j){
b[j] = s2[i]-'0';
}
int lena = s1.size();
int lenb = s2.size();
cout << multi(a,b,lena,lenb) << endl;
return 0;
}
浮点数加法
#include <iostream>
#include <string>
#include <stack>
#include <cmath>
#include <vector>
#include <unordered_set>
#include <iomanip>
#include <algorithm>
using namespace std;
string add(vector<int>& a,vector<int>& b){
int n = a.size();
vector<int> sum(n+1);
for(int i=0;i<n;++i){
sum[i]+=a[i]+b[i];
sum[i+1] = sum[i]/10;
sum[i] = sum[i]%10;
}
if(sum[n]==0){
n--;
}
string res = "";
for(int i=0;i<=n;++i){
res+=sum[i]+'0';
}
return res;
}
int main(){
int n;
cin>>n;
string s1,s2;
while(n--){
cin>>s1>>s2;
reverse(s1.begin(),s1.end());
reverse(s2.begin(),s2.end());
int s1_point_pos = s1.find('.');
int s2_point_pos = s2.find('.');
int point_pos;
if(s1_point_pos>s2_point_pos){
s2.insert(0,s1_point_pos-s2_point_pos,'0');
point_pos = s1_point_pos;
}
else{
s2.insert(0,s2_point_pos-s1_point_pos,'0');
point_pos = s2_point_pos;
}
int len1 = s1.size(),len2 = s2.size();
int len = max(len1,len2);
vector<int> a(len-1),b(len-1);
for(int i=0;i<point_pos;++i){
a[i] = s1[i]-'0';
b[i] = s2[i]-'0';
}
for(int i=point_pos+1;i<len1;++i){
a[i-1] = s1[i]-'0';
}
for(int i=point_pos+1;i<len2;++i){
b[i-1] = s2[i]-'0';
}
string res = add(a,b);
res.insert(res.begin()+point_pos,'.');
reverse(res.begin(),res.end());
while(res.back()=='0'){
res.pop_back();
}
cout<<res<<endl;
}
}