標題:機器人繁殖
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;
}