OpenJ_POJ C16D Extracurricular Sports(找規律,大整數)

這個題題目大意不難懂,就是找到一堆數,使得這些個數得和等於這些個數的最小公倍數。

分析:這就是一個存粹得找規律題,找到規律之後再套上一個大整數得模板完美解決。但是這個規律是真的卡到我了。。。。但是找到之後才發現原來這個規律很簡單:首先不難發現,只有兩個數得時候會輸出-1,n=3時可以找到1,2,3,n=4時可以找到1,2,6,9,n=5時可以找到1,2,6,18,27.。。。。之後可以繼續找下去。一路找下去不難發現,在排除前兩個數之後,除了第n個數之外,那些數都是前一個數的3倍,最後一個數是倒數第二個數除以2再乘以3而來的。

好了規律找到了,接下來就是套用大整數得板子了。。但我這裏突然想到了java中的Bigteger類,這個類可以處理任意大得數(只要你的內存支持)而且精度上也不用擔心,所以直接用得java交的,不過c++也是直接套板子就行,我這裏沒有實現,網上有很多c++大整數得板子,可以自己實現,不難。

java做法:

import java.util.Scanner;

import java.math.*;

public class Main {

	public static void main(String[] args){
		BigInteger[] a1=new BigInteger[210];
		BigInteger[] a2=new BigInteger[210];
		Scanner in=new Scanner(System.in);
		a1[1]=BigInteger.valueOf(1);
		a1[2]=BigInteger.valueOf(2);
		a1[3]=BigInteger.valueOf(6);
		a2[3]=BigInteger.valueOf(3);
		for(int i=4;i<=205;i++){
			a1[i]=a1[i-1].multiply(BigInteger.valueOf(3));
			a2[i]=a2[i-1].multiply(BigInteger.valueOf(3));
		}
		int N=in.nextInt();
		while(true){
			if(N==0)
				break;
			N--;
			int n=in.nextInt();
			if(n<3){
				System.out.println("-1");
				continue;
			}
			for(int i=1;i<n;i++)
				System.out.println(a1[i]);
			System.out.println(a2[n]);
		}
		in.close();
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章