前言

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了。

每日一言

满招损,谦受益---------三国杀陆神将