前言
java实验课上要求1~1000000000之间数据相加求和,首先看到这个题,这还不简单,直接用long数据类型,一个for循环解决问题,一秒出答案:500000000500000000;然后老师随手在1000000000后面加了n个0,让我计算结果。。。。。,显然最后的结果无法用基本数据类型表示,全都会溢出。之后老师提示我们用两个整形数组来存储数据,数组中的元素对应相加,然后进位,最后用个循环输出数组中的元素,也就是最终结果了。话不多说,下面看代码。
实现代码
/**
* 计算从1~1000000000之间的和,打印输出结果
*/
import java.util.Arrays;
/**
* @author 逝不等琴生
*
*/
public class test3_1_2 {
/**
* @param args
*/
/*
* 进位处理
* */
public void carryBit(int [] number)
{
int temp=0;
for(int i=0;i<number.length-1;i++)
{
temp=number[i]/10;
number[i]%=10;
number[i+1]+=temp;
}
}
/*
* 打印数组
* */
public void printArry(int ...number)//可变长度参数
{
int end=number.length-1;
for(;end>=0&&number[end]==0;end--);//过滤掉实际结果后面的0
for(int i=end;i>=0;i--)
{
System.out.printf("%d" ,number[i]);
}
System.out.println();
}
/*
* 加数自增
* */
public void increase(int []number)
{
number[0]++;
carryBit(number);
}
/*
* 两数组相加
* */
public void add(int []first,int []second)
{
for(int i=0;i<first.length;i++)
{
second[i]+=first[i];
}
carryBit(second);
}
public int []addBigNumber(int []data)
{
int result[]=new int[20];//设置结果的位数
int end[]=Arrays.copyOf(data, data.length);
end[end.length-1]=1;
while(!Arrays.equals(data, end))
{
add(data, result);
increase(data);
}
return result;
}
public static void main(String[] args) {
// TODO 自动生成的方法存根
test3_1_2 counter=new test3_1_2();
//int data[]= {1,0,0,0,0,0,0,0,0,0};//0000000001,设置初值,那么对应的末值也就确定了为1000000001
//int end[]= {0,0,0,0,0,0,0,0,0,1};//1000000000
//counter.printArry(end);
int [] data=new int[10];
data[0]=1;
int [] result=counter.addBigNumber(data);
counter.printArry(result);
}
}
我这里是计算1+2+3+…+1000000000的值,如果要计算其他的相加求和的话只需要修改data[] 和 public int []addBigNumber(int []data)函数中end[]的值就ok了。
每日一言
满招损,谦受益---------三国杀陆神将