• 大数加减乘模板


    加法:

     1 char * add(char *s, char *ss) {
     2     memset(str3, 0, sizeof(str3));
     3     int len1 = strlen(s)-1;
     4     int len2 = strlen(ss)-1;
     5     int len3 = 0, x, y, flag = 0;
     6     while(len1 >= 0 || len2 >= 0) {
     7         if(len1 >= 0) x = s[len1] - '0';
     8         else x = 0;
     9         if(len2 >= 0) y = ss[len2] - '0';
    10         else y = 0;
    11         str3[len3++] = (x+y+flag)%10 + '0';
    12         flag = (x+y+flag)/10;
    13         len2--;len1--;
    14     }
    15     if(flag) str3[len3++] = '1';
    16     for(int i = 0; i < len3/2; i ++) {
    17         swap(str3[i],str3[len3-i-1]);
    18     }
    19     return str3;
    20 }

    减法:

     1 char *sub(char *s, char *ss) {
     2     memset(str3, 0, sizeof(str3));
     3     int len1 = strlen(s)-1, len2 = strlen(ss)-1;
     4     int flag = 1, len3 = 0, x, y, cnt = 0;
     5     if(strcmp(s,ss) == 0){
     6         str3[len3++] = '0';
     7         return str3;
     8     }
     9     if(len1 < len2 || (len1==len2&&strcmp(s,ss)<0)) {
    10         swap(len1,len2);
    11         swap(s,ss);
    12         flag = 0;
    13     }
    14     while(len1 >= 0 || len2 >= 0) {
    15         if(len1 >= 0) x = s[len1--] - '0';
    16         else x = 0;
    17         if(len2 >= 0) y = ss[len2--] - '0';
    18         else y = 0;
    19         int ans = x-y+cnt;
    20         if(ans < 0) {
    21             str3[len3++] = ans+10+'0';
    22             cnt = -1;
    23         } else {
    24             str3[len3++] = ans+'0';
    25             cnt = 0;
    26         }
    27     }
    28     while(str3[len3-1] == '0') {
    29         str3[--len3] = '';
    30     }
    31     if(!flag) str3[len3++] = '-';
    32     for(int i = 0; i < len3/2; i ++) swap(str3[i], str3[len3-i-1]);
    33     return str3;
    34 }

    乘法:

     1 int mul(char *s, char *ss,int *num) {
     2     int len1 = strlen(s);
     3     int len2 = strlen(ss);
     4     int len3 = len1+len2;
     5     for(int i = 0; i < len1/2; i ++) swap(s[i],s[len1-i-1]);
     6     for(int i = 0; i < len2/2; i ++) swap(ss[i],ss[len2-i-1]);
     7     for(int i = 0; i < len1; i ++) {
     8         for(int j = 0; j < len2; j ++) {
     9             num[i+j] += (s[i]-'0')*(ss[j]-'0');
    10         }
    11     }
    12     for(int i = 0; i < len3; i ++) {
    13         if(num[i] >= 10) {
    14             num[i+1] += num[i]/10;
    15             num[i] %= 10;
    16         }
    17     }
    18     while(num[len3] == 0 && len3 >= 0) len3--;
    19     len3++;
    20     for(int i = 0; i < len3/2; i ++) {
    21         swap(num[i], num[len3-i-1]);
    22     }
    23     if(!len3) len3++;
    24     return len3;
    25 }
     1 std::string StringMul(const std::string& left, const std::string& right) { 
     2     bool flag1 = (left[0] == '-'), flag2 = (right[0] == '-');
     3     string s1, s2, result;
     4     if(flag1) s1 = left.substr(1,left.length());
     5     else s1 = left;
     6     if(flag2) s2 = right.substr(1,right.length());
     7     else s2 = right;
     8     int len1 = s1.length();
     9     int len2 = s2.length();
    10     int len3 = len1+len2;
    11     vector<int> num(len3+2, 0);
    12     for(int i = 0; i < len1/2; i ++) swap(s1[i],s1[len1-i-1]);
    13     for(int i = 0; i < len2/2; i ++) swap(s2[i],s2[len2-i-1]);
    14     for(int i = 0; i < len1; i ++) {
    15         for(int j = 0; j < len2; j ++) {
    16             num[i+j] += (s1[i]-'0')*(s2[j]-'0');
    17         }
    18     }
    19     for(int i = 0; i < len3; i ++) {
    20         if(num[i] >= 10) {
    21             num[i+1] += num[i]/10;
    22             num[i] %= 10;
    23         }
    24     }
    25     
    26     while(num[len3] == 0 && len3 >= 0) len3--;
    27     len3++;
    28     for(int i = 0; i < len3/2; i ++) {
    29         swap(num[i], num[len3-i-1]);
    30     }
    31     for(int i = 0; i < len3; i ++) {
    32         result = result + char(num[i]+'0');
    33     }
    34     if(!len3) return "0";
    35     if((flag1&&!flag2) || (!flag1&&flag2)) result = '-' + result;
    36     return result;
    37 }
    View Code

    Java的加减乘法:

     1 import java.util.Scanner;
     2 import java.math.BigDecimal;
     3 import java.math.BigInteger;
     4 
     5 public class Main{
     6     public static void main(String[] args) {
     7         Scanner cin = new Scanner(System.in);
     8         BigDecimal a = cin.nextBigDecimal();
     9         BigDecimal b = cin.nextBigDecimal();
    10         BigInteger aa = cin.nextBigInteger();
    11         BigInteger bb = cin.nextBigInteger();
    12         System.out.println("a+b:"+a.add(b));
    13         System.out.println("a-b:"+a.subtract(b));
    14         System.out.println("a*b:"+a.multiply(b));
    15         System.out.println("a/b:"+aa.divide(bb));
    16         System.out.println("a^10:"+a.pow(10));
    17     }
    18 }
  • 相关阅读:
    url 中非法字符替换,java 正则替换
    Ubuntu 下用命令行快速打开html,mp3等文件
    JavaScript HTML DOM 入门详解
    JavaScript 表单验证入门
    javascript with关键字简单用法
    JavaScript 错误处理, Throw、Try 和 Catch入门
    使用 Navicat Premium 将 sql server 的数据库迁移到 mysql 的数据库中
    引入 ServletContextListener @Autowired null 解决办法
    tomcat启动完成执行 某个方法 定时任务(Spring)
    linux启动tomcat很久或者很慢Tomcat启动时卡在“INFO: Deploying web application directory ......”的解决方法
  • 原文地址:https://www.cnblogs.com/xingkongyihao/p/8886441.html
Copyright © 2020-2023  润新知