华为OJ平台——超长正整数相加

题目描述:

  请设计一个算法完成两个超长正整数的加法。

输入

  输入两个字符串数字

输出

  输出相加后的结果,string型

样例输入

  99999999999999999999999999999999999999999999999999 1

样例输出

  100000000000000000000000000000000000000000000000000

思路:

  在Java中,这样的大数运算可以直接用BigInteger类中的方法来进行运算和处理,那样本题没有任何意义了

  因此在本方法中,不直接采用该类中的方法进行运算,直接在字符串中进行逐位运算的方法来得到结果

 1 import java.util.Scanner;
 2
 3 /**
 4  * 请设计一个算法完成两个超长正整数的加法。
 5 输入
 6   输入两个字符串数字
 7 输出
 8   输出相加后的结果,string型
 9 样例输入
10   99999999999999999999999999999999999999999999999999 1
11 样例输出
12   100000000000000000000000000000000000000000000000000
13  *
14  */
15 public class BigDataAdd {
16
17     public static void main(String[] args) {
18         //输入,读取两个字符串
19         Scanner cin = new Scanner(System.in) ;
20         String num1 = cin.next() ;
21         String num2 = cin.next() ;
22         cin.close() ;
23
24         System.out.println(addBigdata(num1,num2));
25
26     }
27
28     /**
29      * 该方法完成运算,返回字符串结果
30      * @param num1
31      * @param num2
32      * @return
33      */
34     private static String addBigdata(String num1, String num2) {
35         int last = 0 ;
36         //用StringBuilder来添加运算结果
37         StringBuilder sb = new StringBuilder() ;
38         int len1 = num1.length() ;
39         int len2 = num2.length() ;
40         int now1 ;  //保存字符串num1中当前运算的 位 的值
41         int now2 ;
42         int res ;  //保存当前位的运算结果
43         for(int i = len1-1, j = len2-1 ; i >= 0 || j >= 0; i--,j--){
44             //获取当前num1的当前运算位的值,
45                         //当最高位超过本串的长度时,设为0
46             if( i >= 0){
47                 now1 = num1.charAt(i) - ‘0‘ ;
48             }else{
49                 now1 = 0 ;
50             }
51             //获取当前num2的当前运算位的值,当最高位超过本串的长度时,设为0
52             if( j >= 0){
53                 now2 = num2.charAt(j) - ‘0‘ ;
54             }else{
55                 now2 = 0 ;
56             }
57             //计算结果,两个当前位以及进位值相加
58             res = now1 + now2 + last ;
59             //当当前位的计算结果大于等于10时需要进位,
60                         //置进位标志位1,保存的计算结果则取个位的值
61             if(res >= 10){
62                 last = 1 ;
63                 res = res - 10 ;
64             }
65             sb.append(res) ;
66
67             res = 0 ;
68         }
69         //最高位运算结束后,若有进位,则应保存结果
70         if(last != 0){
71             sb.append(last) ;
72         }
73         //上面的结果是从个位一次向高位保存的,
74                // 所以正在的结果需要反转一下
75         return sb.reverse().toString() ;
76     }
77 }

Code

时间: 2024-08-02 13:29:01

华为OJ平台——超长正整数相加的相关文章

华为机试题:超长正整数相加

描述:  题目描述:请设计一个算法完成两个超长正整数的加法.  要求实现函数: void AddLongInteger(char * pcAddend, char * pcAugend, char * pcAddResult); 输入参数: char * pcAddend:加数 char * pcAugend:被加数 char * pcAddResult:加法结果 返回值:无 运行时间限制: 1 Sec 内存限制: 128 MByte 输入:  两个超长正整数的字符串 输出:  相加后结果的字符

华为OJ平台——字符串分隔

题目描述: 连续输入字符串,请按长度为8拆分每个字符创 后输出到新的字符串数组: 长度不是8整数倍的字符串请在后面补数字0,空字符串不处理 输入 连续输入字符串(输入两次,每个字符长长度小于100)输出 输出到长度为8,的新字符串数组样例输入 abc 123456789样例输出 abc00000 12345678 90000000 思路: 都是直接处理,没有具体的方法而言 注意点: 华为的OJ平台的输入输出有点坑,好多次的程序都在这里出问题,在Eclipse上运行的结果没问题,然后在OJ上就是编

华为測试 超长整数相加

请设计一个算法完毕两个超长正整数的加法. 输入两个字符串数字 输出相加后的结果.string型 例子输入:99999999999999999999999999999999999999999999999999 1 例子输出:100000000000000000000000000000000000000000000000000 #include<iostream> #include<string> using namespace std; string add(string num1,

华为OJ平台——矩阵乘法

题目描述: 如果A是个x行y列的矩阵,B是个y行z列的矩阵,把A和B相乘,其结果将是另一个x行z列的矩阵C. 输入: 1.第一个矩阵的行数 2.第一个矩阵的列数(也是第二个矩阵的行数) 3.第二个矩阵的列数 4.第一个矩阵的值 5.第二个矩阵的值 输出: 输出两个矩阵相乘的结果 样例输入 2 2 2 3 8 8 0 9 0 18 9 样例输出 171 72 72 0 思路: 题目意思很简单,只是实现两个矩阵乘法功能,要注意的一点是输出的格式. OJ平台中对输出的格式非常严格,经过多次尝试,验证此

华为OJ平台——百钱买百鸡问题

题目描述: 元前五世纪,我国古代数学家张丘建在<算经>一书中提出了“百鸡问题”:鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一. 百钱买百鸡,问鸡翁.鸡母.鸡雏各几何? 思路: 这道题很简单,假设鸡翁 i 只, 鸡母 j 只, 则有 i + j + k = 100 5*i + 3*j + k/3 = 100 由以上两个等式我们可以推出: j = 25 - i * 7/4 ; k = 75 + i * 3/4 ; 由于i. j. k 必须是0或正整数,所以 i 必须是4的倍数,因此我们下面的程序中也是

华为OJ平台试题 —— 数组:字符串反转

字符串反转 代码: /* * 接受一个字符串,然后输出该字符串反转后的字符串. */ #include <stdio.h> #include <string.h> /* * 字符串反转函数 */ char *revstr(char *str, int len) { char *start = str; char *end = str + len - 1; char ch; if (str != NULL) { while (start < end) { ch = *start

华为OJ平台——查找组成一个偶数最接近的两个素数

1 import java.util.Scanner; 2 3 /** 4 * 问题描述:任意一个偶数(大于2)都可以由2个素数组成,组成偶数的2个素数有很多种情况, 5 * 本题目要求输出组成指定偶数的两个素数差值最小的素数对,其中 5 < n <= 10000 6 * eg:输入20,输出7 13 7 */ 8 public class PrimePair { 9 10 public static void main(String[] args) { 11 Scanner cin = ne

华为OJ平台——字符串通配符

题目描述: 在计算机中,通配符一种特殊语法,广泛应用于文件搜索.数据库.正则表达式等领域.现要求各位实现字符串通配符的算法.要求:实现如下2个通配符: *:匹配0个或以上的字符(字符由英文字母和数字0-9组成,不区分大小写.下同)(不包含. , 等特殊字符) ?:匹配1个字符 输入 通配符表达式: 一组字符串. 输出 返回匹配的结果,正确输出true,错误输出false 思路: 分三种情况: (1)无通配符的情况:对应的字符要完全相等,否则匹配失败,输出false (2)通配符为?的情况:对应的

华为OJ平台——求最大连续bit数

题目描述: 求一个byte数字对应的二进制数字中1的最大连续数,例如3的二进制为00000011,最大连续2个1 输入: 一个byte型的数字    输出: 对应的二进制数字中1的最大连续数 思路: 通过移位运算可以一次判断每一位的0.1值,然后通过统计可以得到结果 import java.util.Scanner; //byte 的范围是-128~127 public class MaxContinueOne { public static void main(String[] args) {