高精度加减乘除
高精度加法
把每一位对齐,然后加法进位。
#include<stdio.h>
#include<string.h>
char A[100100] = {0};
char B[100100] = {0};
int S[100100] = {0};
void add(char A[100100], char B[100100]){
int a = strlen(A);
int b = strlen(B);
int len;
if(a==b){
len = a;
}else if(a>b){
int offset = a-b;
for(int i = b; i > 0; i--){
B[i-1+offset] = B[i-1];
}
for(int i = 0; i < offset;i++){
B[i] = '0';
}
len = a;
//for(int i = 0; i < len;i++){
// printf("%c",B[i]);
//}
//printf("\n");
}else if(b>a){
int offset = b-a;
for(int i = a; i > 0; i--){
A[i-1+offset] = A[i-1];
}
for(int i = 0; i < offset;i++){
A[i] = '0';
}
len = b;
}
int p = len - 1;
while(p>=0){
S[p] += A[p]-'0'+B[p]-'0';
S[p-1] += S[p] / 10;
if(p!=0){
S[p] = S[p] % 10;
}
p--;
}
for(int i = 0; i < len; i++){
printf("%d",S[i]);
}
}
int main(){
scanf("%s",&A);
scanf("%s",&B);
add(A,B);
return 0;
}
高精度减法
一定要处理成大数字减去小数字,这样就啥也方便了。跟加法同理。
#include<stdio.h>
#include<string.h>
char A[100100] = {0};
char B[100100] = {0};
int S[100100] = {0};
void dec(char A[100100], char B[100100]){
int a = strlen(A);
int b = strlen(B);
int len;
int flag = 0;
if(a==b){
len = a;
}else if(a>b){
len = a;
int offset = a-b;
for(int i = b-1; i >= 0; i--){
B[i+offset] = B[i];
}
for(int i = 0; i < offset; i++){
B[i] = '0';
}
}else if(b>a){
flag = 1;
len = b;
int offset = b-a;
for(int i = a-1; i >= 0; i--){
A[i+offset] = A[i];
}
for(int i = 0; i < offset; i++){
A[i] = '0';
}
}
if(a==b){
for(int i = 0; i < a; i++){
if(A[i]==B[i])continue;
else if(B[i]>A[i]){
flag = 1;
break;
}else{
break;
}
}
}
int p =len-1;
int s;
while(p>=0){
if(flag) S[p] += B[p] - '0' - A[p] + '0';
else S[p] += A[p] - '0' - B[p] + '0';
if(S[p]<0){
S[p-1] -= 1;
S[p] += 10;
}
p--;
}
int k = 0;
while(S[k]==0&&k<len)k++;
if(flag)printf("-");
if(k==len){
printf("0");
return;
}
for(int i = k; i < len; i++){
printf("%d",S[i]);
}
}
int main(){
scanf("%s",&A);
scanf("%s",&B);
dec(A,B);
return 0;
}
高精度乘法
#include<stdio.h>
#include<string.h>
void mul(char A[100100], char B[10010]){
int temp = 0;
int result[111000] = {0};
int lena, lenb;
lena = strlen(A);
lenb = strlen(B);
for(int i = 0; i < lena; i++){
for(int j = 0; j < lenb; j++){//先反方向全部算进来
result[lena+lenb-1-j-i] += (A[i]-'0')*(B[j]-'0');
}
}
for (int i = 0; i < lena+lenb; i ++ ){
//正着一个一个处理,大一个索引的是用十位数,小则个位数
result[i+1] += result[i] / 10;
result[i] = result[i]%10;
}
int k=lena+lenb;
while(result[k]==0&&k>0){k--;}//去掉前导零,倒着输出
if(k==0){printf("0");return;}
for(int i = k; i > 0; i--){
printf("%d",result[i]);
}
}
int main(){
char A[100100]={0}, B[10010]={0};
scanf("%s",&A);
scanf("%s",&B);
mul(A,B);
return 0;
}
或者
#include<stdio.h>
#include<string.h>
char A[100100] = {0};
char tmpa[100100] = {0};
char tmpb[10100] = {0};
char B[10100] = {0};
int S[110200] = {0};
void mul(char A[100100], char B[10100]){
int a = strlen(A);
int b = strlen(B);
//先逆序存储
for(int i = a-1; i >= 0; i--){
tmpa[a-i-1] = A[i];
}
for(int i = b-1; i >= 0; i--){
tmpb[b-i-1] = B[i];
}
for(int i = 0; i<b;i++){
for(int j = 0; j<a;j++){
S[i+j] += (tmpa[j]-'0')*(tmpb[i]-'0');
S[i+j+1] += S[i+j] / 10;
S[i+j] = S[i+j] % 10;
}
}
//处理前导0
int k = a+b;
while(S[k]==0)k--;
if(k<0){
printf("0");
return;
}
for(int i = k; i>=0; i--){
printf("%d",S[i]);
}
}
int main(){
scanf("%s\n%s",&A,&B);
mul(A,B);
return 0;
}
高精度除法
口诀如下
#include<stdio.h>
#include<string.h>
char A[100100]={0};
int B;
void div(char A[100100], int B){
int yushu=0;
char q[100100]={0};
int len = strlen(A);
for(int i = 0; i < len; i++){
//余数*10加当前
yushu = yushu*10 + (A[i]-'0');
//求当前商更余数
q[i] = yushu/B+'0';
yushu = yushu % B;
}
int k = 0;
while(q[k]=='0')k++;
if(q[k]==0)q[k]='0';
printf("%s\n%d",q+k,yushu);
}
int main(){
scanf("%s\n%d",&A,&B);
div(A,B);
return 0;
}