大数加和问题
问题:
大数的加和不能直接使用基本的int类型,因为int表示的数值范围为是-2^31 ~ 2^31 - 1
,也就是-2147483648到2147483647
,20亿多一点,不能满足大数的加和要求。
思路:
可以使用字符串来表示大数,模拟大数相加的过程。
反转两个字符串,便于从低位到高位的相加,和最高位的进位导致两个大数的和的位数增加;
对齐两个字符串,即短字符串的高位用‘0’补齐,使两个字符串的长度相等,便于后面的相加;
把两个正整数相加,一位一位的加并加上进位。
代码实现:
package exercise_1;
import java.util.Scanner;
public class BigNumber_add {
public static String add(String n1,String n2)
{
StringBuffer result = new StringBuffer();
//1、反转字符串
n1 = new StringBuffer(n1).reverse().toString();
n2 = new StringBuffer(n2).reverse().toString();
int len1 = n1.length();
int len2 = n1.length();
int maxLen = len1 > len2 ? len1 : len2;
boolean nOverFlow = false; //是否越界
int nTakeOver = 0 ; //溢出数量
//2.把两个字符串补齐,即短字符串的高位用0补齐
if(len1 < len2)
{
for(int i = len1 ; i < len2 ; i++)
{
n1 += "0";
}
}
else if (len1 > len2)
{
for(int i = len2 ; i < len1 ; i++)
{
n2 += "0";
}
}
//3.把两个正整数相加,一位一位的加并加上进位
for(int i = 0 ; i < maxLen ; i++)
{
int nSum = Integer.parseInt(n1.charAt(i) +"") + Integer.parseInt(n2.charAt(i) +"");
if(nSum >= 10)
{
if(i == (maxLen - 1))
{
nOverFlow = true;
}
nTakeOver = 1;
result.append(nSum - 10);
}
else
{
nTakeOver = 0;
result.append(nSum);
}
}
//如果溢出的话表示位增加了
if(nOverFlow)
{
result.append(nTakeOver);
}
return result.reverse().toString();
}
public static void main(String[] args) {
//输入测试数据
Scanner scan1= new Scanner(System.in);
Scanner scan2= new Scanner(System.in);
String str1 = scan1.next();
String str2 = scan2.next();
//输出程序运行时间,单位:毫秒
long startTime = System.currentTimeMillis(); //获取开始时间
String str = add(str1,str2); //测试的代码段
System.out.println(str);
long endTime = System.currentTimeMillis(); //获取结束时间
System.out.println("程序运行时间: "+(endTime-startTime)+"ms");
}
}
测试实例:
【补充】输出程序运行时间_java
在网上找了,大概有两种
第一种(以毫秒为单位):
//①伪代码 long startTime=System.currentTimeMillis(); //获取开始时间 doSomeThing(); //测试的代码段 long endTime=System.currentTimeMillis(); //获取结束时间 System.out.println("程序运行时间: "+(end-start)+"ms"); //②伪代码 long startTime=System.currentTimeMillis(); //获取开始时间 doSomeThing(); //测试的代码段 long endTime=System.currentTimeMillis(); //获取结束时间 System.out.println("程序运行时间: "+(end-start)+"ms");
第二种(以纳秒为单位):
//伪代码 long startTime=System.nanoTime(); //获取开始时间 doSomeThing(); //测试的代码段 long endTime=System.nanoTime(); //获取结束时间 System.out.println("程序运行时间: "+(end-start)+"ns");
2018/3/21 23:05:13