大整数运算,没有办法用已有的数据来进行运算的时候
模拟加减乘除运算的过程
大整数又称为高精度整数 即 基本数据类型无法储存其精度的整数
数组中的每一位代表了存放的整数中的每一位
整数的高位存储在数组的高位,整数的低位存储在数组的低位
因为在进行运算的时候都是从整数的低位枚举到高位的 思维相和
struct bign{
int d[1000];
int len;
bign(){//为了避免因忘记初始化而带来的麻烦
memset(d,0,sizeof(d));
len=0;
}//定义一个该结构体的无参的构造函数 ,当定义该结构体的一个变量的时候就会自动的调用这个
//无参的构造函数
};
bign change(char s[]){
bign a;
a.len=strlen(s); //1234
for(int i=0;i<a.len;i++)
a.d[i]=s[a.len-1-i]-'0';
return a;
}
int compare(bign a,bign b){
if(a.len>b.len) return 1;
else if(a.len<b.len) return -1;
else {
for(int i=a.len-1;i>=0;i--){
if(a.d[i]>b.d[i]) return 1;
if(a.d[i]<b.d[i]) return -1;
}
return 0;
}
}
bign add(bign a,bign b){
bign c;
int carry=0;
for(int i=0;i<a.len||i<b.len;i++){
int temp=a.d[i]+b.d[i]+carry;
carry=temp/10;
}
if(carry){
c.d[c.len++]=carry;
}
return c;
}
//bign c;
//
//for(int i=0;i<a.len||i<b.len;i++){
//
// c.d[i]=c.d[i]+a.d[i]+b.d[i];
//
// while(c.d[i]>=10){
//
// c.d[i]-=10;
// c.d[i+1]++;
// }
//
// }
// c.len=max(a.len,b.len);
// if(c.d[c.len]) c,len++;
// return c;
bign sub(bign a,bign b){
bign c;
for(int i=0;i<a.len||i<b.len;i++){
if(a.d[i]<b.d[i]){
a.d[i+1]--;
a.d[i]+=10;
}
c[len++]=a.d[i]-b.d[i];
}
while(c.len>1&&c.d[len-1]==0){
c.len--;
}
return c;
}
A+B:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
const int maxn=10010;
const int N=10;
struct bign{
int d[1000];
int len;
bign(){
memset(d,0,sizeof(d));
len=0;
}
};
bign change(char s[]){
bign a;
a.len=strlen(s);
for(int i=0;i<a.len;i++)
a.d[i]=s[a.len-i-1]-'0';
return a;
}
bign add(bign a,bign b){
bign c;
int carry=0;
for(int i=0;i<a.len||i<b.len;i++){
int temp=a.d[i]+b.d[i]+carry;
c.d[c.len++]=temp%10;
carry=temp/10;
}
if(carry){
c.d[c.len++]=carry;
}
return c;
}
void print(bign a){
for(int i=a.len-1;i>=0;i--)
printf("%d",a.d[i]);
puts("");
}
int main(){
char s1[1000],s2[1000];
scanf("%s%s",s1,s2);
bign a=change(s1);
bign b=change(s2);
print(add(a,b));
return 0;
}
A-B:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=10010;
const int N=10;
struct bign{
int len,d[1000];
bign(){
len=0;
memset(d,0,sizeof(d));
}
};
bign change(char s[]){
bign a;
a.len=strlen(s);
for(int i=0;i<a.len;i++){
a.d[i]=s[a.len-i-1]-'0';
}
return a;
}
bign sub(bign a,bign b){
bign c;
for(int i=0;i<a.len||i<b.len;i++){
if(a.d[i]<b.d[i]){
a.d[i+1]--;
a.d[i]+=10;
}
c.d[c.len++]=a.d[i]-b.d[i];
}
while(c.len>1&&c.d[c.len-1]==0){
c.len--;
}
return c;
}
void print(bign c){
for(int i=c.len-1;i>=0;i--)
printf("%d",c.d[i]);
puts("");
}
int main(){
char s1[1000],s2[1000];
scanf("%s%s",s1,s2);
bign a=change(s1);
bign b=change(s2);
print(sub(a,b));
return 0;
}
A*B:
bign mutil(bign a,int b){
bign c;
int carry=0;
for(int i=0;i<a.len;i++){
int temp=a.d[i]*b+carry;
c.d[len++]=temp%10;
carry=temp/10;
}
while(carry){
c.d[len++]=carry%10;
carry/=10;
}
return c;
}
A/B:
bign divide(bign a,int b,int &r){
bign c;
c.len=a.len;
for(int i=a.len-1;i>=0;i--){
int temp=r*10+a.d[i];
if(temp>=b){
c.d[i]=temp/b;
r=temp%b;
}else{
c.d[i]=0;
r=temp;
}
}
while(c.len>1&&c.d[i]==0)
c.len--;
return c;
}