大数运算--一道华为机试题2018.8.11

题目
表达式计算,只含有正整数,加号,减号,乘号。表达式语法正确,即两数字间只有一个运算符,不用考虑超大数及溢出的情况。输入描述:表达式字符串,不超过255个字符,不含除号,所有数字和符号间无空格输出描述:计算结果输出示例1输入复制1+200输出复制201

刚看到这个题目,把代码几下写出来发现数组访问越界,最后发现样例的数据很长,自己定义的int数据长度不能满足,修改后的java代码如下,还好java有自带的大数库函数,编译后通过。

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.math.BigInteger;

public class Main {
  
    public  boolean  inputString() {
        Scanner scanner = new Scanner(System.in);
 
        String s = scanner.nextLine();
        List<String> list = new ArrayList<>();
        int pos1=s.indexOf('+');
        int pos2=s.indexOf('-');
        int pos3=s.indexOf('*');
        
        if(pos1>0)
        {
            BigInteger a = new BigInteger(s.substring(0, pos1));
            BigInteger b = new BigInteger(s.substring(pos1+1,s.length()));
            System.out.println(a.add(b));
        }
        if(pos2>0)
        {
            BigInteger a = new BigInteger(s.substring(0, pos2));
            BigInteger b = new BigInteger(s.substring(pos2+1,s.length()));
            System.out.println(a.subtract(b));
        }
        if(pos3>0)
        {
            BigInteger a = new BigInteger(s.substring(0, pos3));
            BigInteger b = new BigInteger(s.substring(pos3+1,s.length()));
            System.out.println(a.multiply(b));
        }
        return true;
    }
  

 
    public static void main(String[] args) {
        
        Main main = new Main();
        while(true)
        {
            main.inputString();
        }  
    }    
}
 

这是java自带的大数库函数,想了下应该用c语言实现以下相应的运算,先实现一个乘法。

 #include<stdio.h>
 #include<stdlib.h>
 #include<string.h>
#define BUFSIZ 1024
 char * bigmul(char *m,int lena,char *f,int lenb){  //乘法运算函数。
    int i,j,k,lensum,tmp_result,carry,num='0';
    lensum=lena+lenb;                               //确定结果数组的长度。两位数乘两位数,最多得到4位数,同理可得其他情况。
    for(i=0;i<lena;i++){                            //将ASCII码转为对应的数字存储。
           m[i]=m[i]-num;
        }
        for(i=0;i<lenb;i++){
           f[i]=f[i]-num;
        }
        char *result,final[BUFSIZ];

        result=(char*)calloc(lensum+1,1);///calloc相对于malloc不同之处在于可以申请连续的存储空间。
        memset(final,0,BUFSIZ);
        memset(result,0,lensum+1); ///清零
        for(i=0;i<lenb;i++)
        {                      //为被乘数作一趟乘法。
           for(j=0;j<lena;j++)
           {
              tmp_result=f[lenb-i-1]*m[lena-j-1];
              result[j+i]+=tmp_result;
           }
           for(k=0;k<=j+i-1;k++)
           {                 //每作一趟乘法整理一次结果数组。
              if(result[k]>9)
              {
                 carry=result[k]/10;
                 result[k]=result[k]%10;
                 result[k+1] += carry;
              }
           }
        }
        j=0;
        if(result[lensum-1]!=0){                  //去除前导零将结果整理到final数组中。
           final[j]=result[lensum-1]+num;
           j++;
        }
        for(i=lensum-2;i>=0;i--){
           final[j++]=result[i]+num;
        }
        memcpy(result,final,strlen(final));                             //将指针指向final数组并返回该指针。      
        return result;
     }
 int main(){                                                 //利用main测试方法,用puts打印结果。               
      int lena,lenb;
      char *result,sa[BUFSIZ],sb[BUFSIZ];
      scanf("%s",sa);
      scanf("%s",sb);
      lena=strlen(sa);
      lenb=strlen(sb);
      result=bigmul(sa,lena,sb,lenb);
      puts(result);
    ///printf("%s\n",result);
      ///char ch=97;
      ///printf("%c\n",ch);
    return 0;
 }

剩下的交给大家了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值