大数的加减乘除

  • 大数的减法
#include <stdio.h>
#include <string.h>
int x[100]= {0},y[100]= {0},z[100]= {0};
int flag=1;
void sub(int x[],int y[],int p) {
    int i,o;
    for(i=0; i<p; i++) { //进行相减
        if(x[i]>=y[i]) {
            z[i]=x[i]-y[i];
        } else {
            z[i]=x[i]-y[i]+10;
            x[i+1]--;
        }
    }
    for(i=p-1; i>=0; i--) { //排除前几位为零的情况
        if(z[i]!=0) {
            o=i;
            break;
        }
    }
    if(flag)
        printf("0\n");
    else {
        for(i=o; i>=0; i--) {
            //倒序打出结果
            printf("%d",z[i]);
        }
        printf("\n");
    }
}
int main() {
    char a[100],b[100];//定义两个字符数组来接收两个大数;
    int i,j,m,n,q;
    scanf("%s %s",a,b);
    m=strlen(a);
    n=strlen(b);
    j=0;
    for(i=m-1; i>=0; i--) { //字符数组转化为倒序int型数组;
        x[j]=a[i]-'0';
        j++;
    }
    j=0;
    for(i=n-1; i>=0; i--) {
        y[j]=b[i]-'0';
        j++;
    }
    if(m>n) { //判断减数与被减数的位数
        flag=0;
        sub(x,y,m);
    } else if(m<n) {
        printf("-");
        flag=0;
        sub(y,x,n);
    } else {
        for(i=m-1; i>=0; i--) {
            if(x[i]!=y[i]) {
                if(x[i]>y[i]) {
                    flag=0;
                    sub(x,y,m);
                    break;
                } else {
                    printf("-");
                    flag=0;
                    sub(y,x,m);
                    break;
                }
            } else continue;
        }
    }
    return 0;
}

大数的乘法

 

#include<stdio.h>
#include<string.h>
#define MAX 100
char a[MAX],b[MAX];
int aa[10005],len;//aa[]保存相乘后的结果,len来相乘后的保存数据的长度 (正序) 
void Multplay(){
    int x[MAX+10]={0},y[MAX+10]={0},z[MAX*2+10]={0};    
    int len1,len2,i,j;
    len1=strlen(a);
        len2=strlen(b);
        
        for(j=0,i=len1-1;i>=0;i--)   //将a[]转换为整形数组 (逆序倒序储存)
            x[j++]=a[i]-'0';
        for(j=0,i=len2-1;i>=0;i--)   //将b[]转换为整形数组 (逆序倒序储存) 
            y[j++]=b[i]-'0';
            
            
        for(i=0;i<len1;i++)           //将因数各个位上的数字与另一个各个位上的数字相乘 
        {
            for(j=0;j<len2;j++)
                z[i+j]=z[i+j]+x[i]*y[j];//先乘起来,后面统一进行进位
        } 
        
        
        for(i=0;i<MAX*2;i++)  //进行进位 
        {
            if(z[i]>=10)   
            {
                z[i+1]=z[i+1]+z[i]/10;   
                z[i]=z[i]%10;  
            }
        }
        
        for(i=MAX*2;i>0;i--)  
        {
            if(z[i]==0)
                continue;
            else
                break;
        }
        len=0;
        for(;i>=0;i--)  
        aa[len++]=z[i];
}
int main()
{ 
while(~scanf("%s%s",a,b))   
    {    
    memset(aa,0,sizeof(aa));
    Multplay();    
    for(int i=0;i<len;i++) 
    printf("%d",aa[i]);
    printf("\n");
   }
 
    return 0;
}

大数加法

 

#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
void sum(string a,string b) {
    for(int i=a.length()-1,j=b.length()-1; i>=0; i--,j--) {
        a[i]=char(a[i]+(j>=0?b[j]-'0':0));
        if(a[i]-'0'>=10) {
            a[i]=char((a[i]-'0')%10+'0');
            if(i)
                a[i-1]++;
            else
                a='1'+a;
        }
    }
    cout<<a<<endl;
}
int main() {
    string m,n;
    cin>>m>>n;
    if(m.length()<n.length()) {
        string temp=m;
        m=n;
        n=temp;
    }
    sum(m,n);
    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值