大整数运算

  • A+B问题
    对于A+B问题,当然如果A和B是属于int范围内的话,应该会轻松的解决。然而假若A和或者B是超过int范围的数字,那么就无法通过简单的加法来实现了,此类问题就是 大整数加法问题

解法:可通过字符串的形式先存储A和B(输入的顺序和存储的顺序要逆转),然后,再模拟加法的过程,最后再将结果打印出来即可。最难的莫过于模拟加法的过程了,不过理解了还是挺简单的

代码

#include
#include<string.h>
struct bigN{
    int d[1000];
    int len;
    bigN(){
        memset(d,0,sizeof(d));
        len=0;
    } 
};
bigN change(char str[]){
    bigN a;
    a.len=strlen(str);
    for(int i=0;ilen;i++){
        a.d[i]=str[a.len-i-1]-'0';
    }
    return a;
}
bigN add(bigN a,bigN b){
    bigN c;
    int carry=0;
    for(int i=0;ilen||ilen;i++){
        int temp=a.d[i]+b.d[i]+carry;
        c.d[c.len++]=temp%10;
        carry=temp/10;
    }
    if(carry !=0){
        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]);
    }
}
int main(){
    char str1[1000],str2[1000];
    scanf("%s%s",str1,str2);
    bigN a=change(str1);
    bigN b=change(str2);
    print(add(a,b));
    return 0;
}

大整数运算_第1张图片

  • A-B问题

解法:和A+B问题类似,所不同的是,它需要考虑A和B的大小问题,然后涉及到了A和B的比较,通过对数组的逐个比较,然后得出A和B的大小结果,再进行大整数的相减问题:比较被减位和减位,若不够减,则被减位高位减1,被减位加10再进行减法;若够减,则直接减法。值得注意的是:高位减法可能会使得高位有多余的0,要忽略它,但要保证结果位数至少一位。

代码

#include
#include
struct bigN{
    int d[1000];
    int len;
    bigN(){
        memset(d,0,sizeof(d));
        len=0;
    } 
};
bigN change(char str[]){
    bigN a;
    a.len=strlen(str);
    for(int i=0;i1]-'0';
    }
    return a;
}
bigN sub(bigN a,bigN b){
    bigN c;
    for(int i=0;iif(a.d[i]1]--;
            a.d[i]+=10; 
        }
        c.d[c.len++]=a.d[i]-b.d[i];
    }
    while(c.len-1>=1&&c.d[c.len-1]==0){
        c.len--;          //去掉最高位的0,同时至少保留一位最低位 
    }
    return c;
}
void print(bigN a){
    for(int i =a.len-1;i>=0;i--){
        printf("%d",a.d[i]);
    }
}
int compare(bigN a,bigN b){
    if(a.len>b.len)return 1;
    else if(a.lenreturn -1;
    else {
        for(int i=a.len-1;i>=0;i++){
            if(a.d[i]>b.d[i])return 1;
            else if(a.d[i]return -1;
        }
        return 0;
    }
}

int main(){
    char str1[1000],str2[1000];
    scanf("%s%s",str1,str2);
    bigN a=change(str1);
    bigN b=change(str2);
    if(compare(a,b)<0){
        bigN temp=a;
        a=b;
        b=temp;
    putchar('-');
    print(sub(a,b));
    }
    else print(sub(a,b));
    return 0;
}

大整数运算_第2张图片
大整数运算_第3张图片

  • A*B问题
    解法: A*B问题,一般情况下都是高精度与低精度的乘法,高精度与高精度的乘法一般不涉及。在bigN结构体中的某位与Int型整体相乘,再与进位相加,所得结果的个位数作为该位结果,高位部分作为新 的进位。和A+B问题类似。

代码

#include
#include
struct bigN{
    int d[1000];
    int len;
    bigN(){
        memset(d,0,sizeof(d));
        len=0;
    } 
};
bigN change(char str[]){
    bigN a;
    a.len=strlen(str);
    for(int i=0;i1]-'0';
    }
    return a;
}
bigN mul(bigN a,int b){
    bigN c;
    int carry=0;
    for(int i=0;iint temp=a.d[i]*b+carry;
        c.d[c.len++]=temp%10;
        carry=temp/10;
    }
    if(carry !=0){
        c.d[c.len++]=carry%10;
        carry/=10;
    }
    return c;
}
void print(bigN a){
    for(int i =a.len-1;i>=0;i--){
        printf("%d",a.d[i]);
    }
}
int main(){
    char str1[1000];
    int b;
    scanf("%s%d",str1,&b);
    bigN a=change(str1);
    print(mul(a,b));
    return 0;
}

大整数运算_第4张图片

  • A/B问题

解法:除法的计算方法和小学所学相同,以1234/7为例:
一、1与7比较,不够除,故该位商为0,余数为1;
二、余数1与新位2组成12,12与7比较,够除,商为1,余数为5;
三、余数5与新位3组成53,53与7比较,够除,商为7,余数4;
四、余数4与新位4组成44,44与7比较,够除,商为6,余数为2 ;

总结上述某一步的步骤:上一步的余数乘以10加上该步的位,得到该步临时的被除数,将其与除数比较:如果不够除,则该位的商为0;若果够除,则商为对应的商,余数即为对应的余数。最后一步要注意减法后高位可能有多余的0,要忽视它们,但也要保证结果至少有一位数。

代码

#include
#include<string.h>
struct bigN{
    int d[1000];
    int len;
    bigN(){
        memset(d,0,sizeof(d));
        len=0;
    } 
};
bigN change(char str[]){
    bigN a;
    a.len=strlen(str);
    for(int i=0;ilen;i++){
        a.d[i]=str[a.len-i-1]-'0';
    }
    return a;
}
bigN div(bigN a,int b,int&r){
    bigN c;
    c.len=a.len;
    for(int i=a.len-1;i>=0;i--){
        r=r*10+a.d[i];
        if(r=0;
        else {
            c.d[i]=r/b;
            r=r%b;
        } 
    }
    while(c.len-1>=1&&c.d[c.len-1]==0){
        c.len--;          //去掉最高位的0,同时至少保留一位最低位 
    }
    return c;
}
void print(bigN a){
    for(int i =a.len-1;i>=0;i--){
        printf("%d",a.d[i]);
    }
}


int main(){
    char str1[1000];
    int b,r=0;
    scanf("%s%d",str1,&b);
    bigN a=change(str1);
     print(div(a,b,r));
    return 0;
}

大整数运算_第5张图片

小结

大整数运算,总体来说十分适合出面试题,大多数都是涉及到数组以及一些基本的数学知识,这是个不错的题型,可以好好的研究研究

你可能感兴趣的:(c语言)