15年國賽 機器繁殖

標題:機器人繁殖

X星系的機器人可以自動複製自己。它們用1年的時間可以複製出2個自己,然後就失去複製能力。
每年X星系都會選出1個新出生的機器人發往太空。也就是說,如果X星系原有機器人5個,
1年後總數是:5 + 9 = 14
2年後總數是:5 + 9 + 17 = 31

如果已經探測經過n年後的機器人總數s,你能算出最初有多少機器人嗎?

數據格式:

輸入一行兩個數字n和s,用空格分開,含義如上。n不大於100,s位數不超過50位。

要求輸出一行,一個整數,表示最初有機器人多少個。

例如:
用戶輸入:
2 31

則程序應該輸出:
5

再例如:
用戶輸入:
97 2218388550399401452619230609499

則程序應該輸出:
8

 

笨辦法就是一年一年地累加計算,撞上總和就可以了。
這可能需要大整數的運算。
也可以取巧,實際上,總和沒必要那麼精確,只要大約知道規模就可以了。
所以,總和到底有多少位比具體是多少更重要。把尾巴都忽略了都可以算出來!
直接用double計算,誤差1%,就足夠了。


import java.util.*;
import java.math.BigInteger;
public class Main
{
	static boolean test(int begin, int n, BigInteger sum0)
	{
		//System.out.println("de: " + begin + "," + n + "," + sum0);
		
		BigInteger a = BigInteger.valueOf(begin);
		BigInteger sum = a;
		
		for(int i=1; i<=n; i++){
			a = a.add(a).subtract(BigInteger.ONE);
			sum = sum.add(a);
		}		
		
		return sum.equals(sum0);
	}
	
	public static void main(String[] args)
	{
		Scanner scan = new Scanner(System.in);
		
		String[] ss = scan.nextLine().split(" ");
		
		int a = Integer.parseInt(ss[0]);
		BigInteger b = new BigInteger(ss[1]);
		
		
		for(int i=1; i<100; i++) { 
			if(test(i,a,b)) {
				System.out.println(i); 
				break;
			}
		}
	}
}

#include <stdio.h>
#include <math.h>
#include <string.h>

int test(int begin, int n, double sum0)
{
	double a = begin;
	double sum = a;
	int i;
	
	for(i=1; i<=n; i++){
		a = a * 2 - 1;
		sum = sum + a;
	}		
	
	return fabs(sum-sum0)/sum < 0.01;
}

int main()
{
	int a; //  after a years 
	double b;  // 	all number
	int i;  // begin number
	char buf[1000];
	int len; //number length in buf
	
	scanf("%d", &a);
	scanf("%s", buf);
	
	len = strlen(buf);
	
	if(len<10) 
		b = atoi(buf);
	else{
		buf[9] = 0;
		b =  atoi(buf) * pow(10,len-9);
	}
			
	for(i=1; i<100; i++) { 
		if(test(i,a,b)) {
			printf("%d\n",i); 
			break;
		}
	}	
	return 0;
}

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章