高精度加减乘除

高精度加法

把每一位对齐,然后加法进位。

#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;
}
posted @ 2025-05-30 20:49  .N1nEmAn  阅读(20)  评论(0)    收藏  举报