机器人繁殖

来源:互联网 发布:图像和矩阵卷积 编辑:程序博客网 时间:2024/04/27 16:45


标题:机器人繁殖


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


资源约定:
峰值内存消耗 < 512M
CPU消耗  < 1000ms




请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。


所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。


注意: main函数需要返回0
注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。

注意: 所有依赖的函数必须明确地在源文件中 #include <xxx>, 不能通过工程设置而省略常用头文件。


提交时,注意选择所期望的编译器类型。


思路 :仔细观察题目后你会发现题目和斐波那契数列很像 

如果不发射机器人 :机器人数量变化是   x      x+2x     x+2x+4x       x+2x+4x+8x    ……      (2^(n+1)-1)x

              0年     1年           2年              3年                                   n年

也就是说当你知道机器人总数后   除以(2^(n+1)-1)   就能得到 初始的机器人数   


要注意的是    给的机器人数量 是 每年发出一个新机器人后的数量  所以要求出 到底发出送了多少机器人  (注意:发出去的机器人也可以繁殖 这些数量同样要加上   )

听起来很麻烦 其实 就一个公式的事  应为是有规律的  :

第一年 发出的机器人变成了   2^(n)-1    个

第2年 发出的机器人变成了   2^(n-1)-1    个

第3年 发出的机器人变成了   2^(n-2)-1    个

……

第n-1年 发出的机器人变成了   2^2 - 1 个

第n年 发出的机器人变成了    2^1 -1 个

求一下和   就是 ( 2^(n+1)-1)-1-n       ;(应为没有2^0  说以多加个 1 要减去)

化简一下就是 2^(n+1)-n-2;

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


int main(void)
{
int n;
  
double a,sum,c,b;//由于数据很大用 double 存储 


scanf("%d %lf",&n,&sum);

c =pow(2,n+1)-n-2;//求每年送出去的机器人总数 
a =(sum+c);//求出每年不把机器人发送到太空的 机器人总数 
b=(pow(2,n+1)-1);//机器人的增长倍数  于年数有关 0年1倍  1年 3倍  2年 7倍   3年 15倍   4年 31倍   就是  2的(n+1)次方-1 

printf("%d",(int)(a/b));//用总数除以增长倍数  初始机器人数 
return 0;
}



原创粉丝点击