1. 程式人生 > >求和1-1000000...000(n個0)相加

求和1-1000000...000(n個0)相加

前言

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

每日一言

滿招損,謙受益---------三國殺陸神將