目录
1.两数之和(高精度)
题目描述
高精度加法,相当于a+b problem,不用考虑负数.
输入格式
分两行输入。a,b≤
输出格式
输出只有一行,代表a+b的值
#include<bits/stdc++.h>
using namespace std;
int main(){
char a[100001], b[100001];//将数字以字符数组的形式输入
cin>>a>>b;
int jw = 0, n1, n2, maxn;//maxn为输入的两个数中位数更大的位数
int aa[100001], bb[100001];
n1 = strlen(a);//n1为输入的第一个数的位数
n2 = strlen(b);//n2为输入的第二个数的位数
for(int i = 0;i<n1;i++){
aa[i] = a[n1-i-1]-'0';//将存入的第一个数以整形数组的形式存储,各个数位对应整型数组的各个值
}
for(int i = 0;i<n2;i++){
bb[i] = b[n2-i-1]-'0';//将存入的第二个数以整型数组的形式存储,各个数位对应整型数组的各个值
}
if(n1>n2)
maxn = n1;
else
maxn = n2;
int sum[maxn];
for(int i = 0;i<maxn;i++){
sum[i] = aa[i]+bb[i]+jw;
jw = sum[i]/10;
sum[i] = sum[i]%10;
}
if(jw==1)
cout<<jw;//若最高位有进位,单独数位最高的进位值,及和的最高位
for(int i = maxn-1;i>=0;i--){
cout<<sum[i];
}
}
2.两数相乘(高精度)
题目描述
求两数的积。
输入格式
两行,两个整数。每个数字不超过 ,需用高精。
输出格式
一行一个整数表示乘积。
找规律,当相乘各数位不存在进位时:
当数位存在进位时:
c[k] = a[i]*b[j],其中k= i+j,用二重for循环实现遍历
#include<bits/stdc++.h>
using namespace std;
int main(){
char a[100001], b[100001];//将数字以字符数组的形式输入
cin>>a>>b;
int aa[100001],bb[100001];
int jw = 0, n1, n2, flag = 0;
n1 = strlen(a);//n1为输入的第一个数的位数
n2 = strlen(b);//n2为输入的第一个数的位数
for(int i = 0;i<n1;i++){
aa[i] = a[n1-i-1]-'0';//将存入的第一个数以整形数组的形式存储,各个数位对应整型数组的各个值
}
for(int i = 0;i<n2;i++){
bb[i] = b[n2-i-1]-'0';//将存入的第二个数以整形数组的形式存储,各个数位对应整型数组的各个值
}
int maxn = n1+n2-1;
int c[maxn];
memset(c,0,sizeof(c));//将数组值全部初始化为0
for(int i = 0;i<n1;i++){
for(int j = 0;j<n2;j++){
c[i+j] = c[i+j]+aa[i]*bb[j];//不进位时乘积各个位数的值
}
}
for(int i = 0;i<maxn;i++){//进位操作
c[i] = c[i]+jw;
jw = c[i]/10;
c[i] = c[i]%10;
}
if(jw!=0)
cout<<jw;
for(int i = maxn-1;i>=0;i--){
if(c[i]!=0||i==0)//计算出来的乘积最高数位不能为0,除非最后一位为0
flag = 1;
if(flag == 1)
cout<<c[i];
}
}