高精度加法:
#include<bits/stdc++.h>
using namespace std
;
const int A
=300;
int n
,m
;
char a
[A
],b
[A
];
int s1
[A
],s2
[A
];
int r
[A
];
signed main(){
scanf("%s%s",a
,b
);
n
=strlen(a
),m
=strlen(b
);
for(int i
=1;i
<=n
;i
++)
s1
[i
]=a
[n
-i
]-'0';
for(int i
=1;i
<=m
;i
++)
s2
[i
]=b
[m
-i
]-'0';
n
=max(n
,m
);
int jw
=0;
for(int i
=1;i
<=n
;i
++){
jw
=s1
[i
]+s2
[i
]+jw
;
r
[i
]=jw
%10;
jw
/=10;
}
if(jw
) r
[++n
]=jw
;
while(n
>1&&!r
[n
]) n
--;
for(int i
=n
;i
>0;i
--)
printf("%d",r
[i
]);
return 0;
}
高精度减法:
#include<bits./stdc++.h>
using namespace std
;
const int A
=500;
int n
,m
;
string x
,y
;
int a
[A
],b
[A
];
int r
[A
];
signed main(){
cin
>>x
>>y
;
n
=x
.size(),m
=y
.size();
if(n
<m
){
printf("-");
swap(x
,y
);
swap(n
,m
);
}
if(n
==m
)
if(x
<y
){
printf("-");
swap(x
,y
);
}
for(int i
=1;i
<=n
;i
++)
a
[i
]=x
[n
-i
]-'0';
for(int i
=1;i
<=m
;i
++)
b
[i
]=y
[m
-i
]-'0';
int c
=0;
for(int i
=1;i
<=n
;i
++){
if(a
[i
]>=b
[i
]+c
){
r
[i
]=a
[i
]-b
[i
]-c
;
c
=0;
}
else{
r
[i
]=10+a
[i
]-b
[i
]-c
;
c
=1;
}
}
while(!r
[n
]&&n
>1) n
--;
for(int i
=n
;i
>0;i
--)
printf("%d",r
[i
]);
return 0;
}
高精度乘法:
#include<bits/stdc++.h>
using namespace std
;
const int A
=1e3;
string x
,y
;
int n
,m
;
int a
[A
],b
[A
];
int r
[A
];
signed main(){
cin
>>x
>>y
;
n
=x
.size(),m
=y
.size();
for(int i
=1;i
<=n
;i
++)
a
[i
]=x
[n
-i
]-'0';
for(int i
=1;i
<=m
;i
++)
b
[i
]=y
[m
-i
]-'0';
int jw
=0;
for(int i
=1;i
<=n
;i
++){
jw
=0;
for(int j
=1;j
<=m
;j
++){
jw
=a
[i
]*b
[j
]+r
[i
+j
-1]+jw
;
r
[i
+j
-1]=jw
%10;
jw
/=10;
}
if(jw
) r
[i
+m
]=jw
;
}
int w
=n
+m
;
while(!r
[w
]&&w
>1) w
--;
for(int i
=w
;i
>0;i
--)
printf("%d",r
[i
]);
return 0;
}
高精除单精
#include<bits/stdc++.h>
using namespace std
;
const int A
=500;
string x
;
int n
;
int a
[A
];
int r
[A
];
int c
;
signed main(){
cin
>>x
;
scanf("%d",&c
);
n
=x
.size();
for(int i
=1;i
<=n
;i
++)
a
[i
]=x
[i
-1]-'0';
int jw
=0;
for(int i
=1;i
<=n
;i
++){
jw
=jw
*10+a
[i
];
r
[i
]=jw
/c
;
jw
=jw
%c
;
}
int tot
=1;
while(tot
<n
&&!r
[tot
]) tot
++;
for(int i
=tot
;i
<=n
;i
++)
printf("%d",r
[i
]);
printf("\n");
printf("%d",jw
);
return 0;
}
高精除高精
(模拟即可) 采用计算机做高精度除法时,模拟日常除法的步骤。但计算机不可能做“试商”,这时,我们可以采用减法来模拟。
"试商"的算法的步骤如下: 1、将除数移动和被除数对齐,位数不够时,补0, 2、利用被除数减去除数,一直减到被除数小于除数,减的次数,就是“试商”的结果,每移动一次。 3、重复上述步骤,一直到被除数和除数的位数相等为止。
代码:
#include<bits/stdc++.h>
using namespace std
;
const int A
=500;
string x
,y
;
int n
,m
;
int a
[A
],b
[A
];
int q
[A
],r
[A
],cs
=0,wq
=0;
int res
[A
];
bool compare(){
if(wq
>m
) return true;
if(wq
<m
) return false;
for(int i
=m
;i
>0;i
--){
if(q
[i
]>b
[i
]) return true;
if(q
[i
]<b
[i
]) return false;
}
return true;
}
int sc(int wz
){
cs
=0,wq
=0;
for(int i
=wz
;i
>0;i
--){
q
[wz
-i
+1]=a
[i
];
if(a
[i
]) wq
=wz
-i
+1;
}
while(compare()){
int jw
=0;
for(int i
=1;i
<=wq
;i
++){
if(q
[i
]>=b
[i
]+jw
){
r
[i
]=q
[i
]-b
[i
]-jw
;
jw
=0;
continue;
}
if(q
[i
]<b
[i
]+jw
){
r
[i
]=q
[i
]+10-b
[i
]-jw
;
jw
=1;
continue;
}
}
cs
++;
int sw
=0;
for(int i
=1;i
<=wq
;i
++){
q
[i
]=r
[i
];
if(q
[i
]) sw
=i
;
}
wq
=sw
;
}
for(int i
=wz
;i
>0;i
--)
a
[i
]=q
[wz
-i
+1];
}
signed main(){
cin
>>x
>>y
;
n
=x
.size(),m
=y
.size();
for(int i
=1;i
<=n
;i
++)
a
[i
]=x
[i
-1]-'0';
for(int i
=1;i
<=m
;i
++)
b
[i
]=y
[m
-i
]-'0';
if(n
<m
){
printf("0\n");
for(int i
=1;i
<=n
;i
++)
printf("%d",a
[i
]);
return 0;
}
for(int i
=m
;i
<=n
;i
++){
sc(i
);
res
[i
]=cs
;
}
int tot1
=0;
while(!res
[tot1
]&&tot1
<n
) tot1
++;
int tot2
=0;
while(!a
[tot2
]&&tot2
<n
) tot2
++;
for(int i
=tot1
;i
<=n
;i
++)
printf("%d",res
[i
]);
printf("\n");
for(int i
=tot2
;i
<=n
;i
++)
printf("%d",a
[i
]);
return 0;
}