POJ2389:Bull Math(大整数乘法)

题目描述

http://poj.org/problem?id=2389
大整数乘法

题目分析

  • 两个乘数都是大整数,相比于大整数乘int要适用的更广泛一些
  • 乘法需要注意进位
  • 相乘之后的结果要注意前导0,就是字符数组前面无意义的0,需要去掉
  • 这道题说40位以内是假的。。。开数组的时候开的大一些

代码

#include<stdio.h>
#include<string.h>
#define N 100
int num_arr[N];
char* multi(char *a,char *b){
    int la=strlen(a);
    int lb=strlen(b);
    //计算每一位 
    for(int i=0;i<la;i++){
        for(int j=0;j<lb;j++){
            num_arr[i+j+1]+=(a[i]-'0')*(b[j]-'0');
        }
    }
    //算每一位的进位 
    for(int i=la+lb-1;i>=0;i--){
        if(num_arr[i]>=10){
            num_arr[i-1]+=num_arr[i]/10;
            num_arr[i]%=10;
        }
    }
    //将int*换成char*输出(不换的话其实也可以,直接输出) 
    char *res=new char[la+lb+1];
    //去掉前导0 
    int i=0;
    while(num_arr[i]==0){
        i++;
    }
    int j;
    for(j=0;i<la+lb;i++,j++){//这里是i,是i,是i<la+lb 
        res[j]=num_arr[i]+'0';
    }
    res[j]='\0';//字符串数组最后一位,没这一步后导0去不掉 
    return res;
}
char a[N],b[N];
int main() {
    scanf("%s",a);
    scanf("%s",b);
    char *res=multi(a,b);
    printf("%s\n",res); 
    delete[] res;
    return 0;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值