算法题目:有一个八层灯塔,每层的灯数都是上一层的2倍,共有765盏灯,编程,求最上层的灯和最下层的灯数。
编程思路分析
编程思路:
1、编程实现1-8层灯数;
2、显示最下层灯数量和最上层灯数量。
程序范例
int main()
{
/*n:八楼灯的数量假设为1m:楼层的变化灯的数量sum:灯的总数量 */
int n = 1,m,sum ,i;
while(1)
{
m = n; //m存储八楼灯的数量
/*如果判断结果八个楼层的灯的数量大于或者小于765则将灯的总数清零*/
sum = 0;
for(i = 1;i < 8; i++)
{
m = m * 2;//每层的灯数都是上一层的2倍
sum += m;//计算出除了一楼外灯的数量
}
sum += n;//加上一楼灯的数量
if(sum == 765)
{
printf("输出八楼灯的数量:%d\r\n",n);
printf("输出一楼灯的数量:%d\r\n",m);
break;
}
n++;//灯的数量加1
}
}
程序运行结果案例:
编程思路分析
编程思路:
1、编程实现1-8层灯数;
2、显示最下层灯数量和最上层灯数量。
程序范例
int main()
{
/*n:八楼灯的数量假设为1m:楼层的变化灯的数量sum:灯的总数量 */
int n = 1,m,sum ,i;
while(1)
{
m = n; //m存储八楼灯的数量
/*如果判断结果八个楼层的灯的数量大于或者小于765则将灯的总数清零*/
sum = 0;
for(i = 1;i < 8; i++)
{
m = m * 2;//每层的灯数都是上一层的2倍
sum += m;//计算出除了一楼外灯的数量
}
sum += n;//加上一楼灯的数量
if(sum == 765)
{
printf("输出八楼灯的数量:%d\r\n",n);
printf("输出一楼灯的数量:%d\r\n",m);
break;
}
n++;//灯的数量加1
}
}
程序运行结果案例:
#松坂书屋#微店新到货现货图书推荐1:https://t.cn/A62Gr5OS《CLAMP PREMIUM COLLECTION ×××HOLiC(15) (KCデラックス)》《CLAMP PREMIUM COLLECTION ×××HOLiC(16) (KCデラックス)》《FAIRY TAIL 100 YEARS QUEST(11) (講談社コミックス)》《Dr.STONE 25 (ジャンプコミックス)》《Fate Grand Order-turas realta-(12) (講談社コミックス)》《SPY×FAMILY 1~3巻セット (ジャンプコミックス)》《アオのハコ 4 (ジャンプコミックス)》《はたらく細胞WHITE(3) (シリウスKC)》《ヒプノシスマイク -Division Rap Battle- side B.B & M.T.C+(2)限定版》《ヒプノシスマイク -Division Rap Battle- side F.P & M+ (2) 限定版 (ZERO-SUMコミックス)》《魔女の旅々(4) (ガンガンコミックス UP!)》《宇崎ちゃんは遊びたい! 8 (ドラゴンコミックスエイジ)》预计快递发货时间为3月26日左右,由于疫情影响部分地区暂停发货,上海地区可选择到店自提,自提时间为3月26日下午开始。
我应该是走火入魔了
一个乱算了两个小时的小发现
(我应该不是第一个,或者说这是很容易数学推导的数学公式)
在图1的数学模型中
n个人传m次
要求传球方案数sum
但是我用dfs计算量是2^m
当m>15?且m是偶数时
一定会超时
所以我一通乱算后
发现如下小公式
sum=2^(m/2)×(sum_last-1)+sum_last
这里的sum_last是当n不变,m=m/2时的sum
这样就可以把m一直/2
直到变成较小的数
指数级减少计算机运算量
但是...
这道题我还是没有得满分
明日再战[睡]
我一定是疯了
一个乱算了两个小时的小发现
(我应该不是第一个,或者说这是很容易数学推导的数学公式)
在图1的数学模型中
n个人传m次
要求传球方案数sum
但是我用dfs计算量是2^m
当m>15?且m是偶数时
一定会超时
所以我一通乱算后
发现如下小公式
sum=2^(m/2)×(sum_last-1)+sum_last
这里的sum_last是当n不变,m=m/2时的sum
这样就可以把m一直/2
直到变成较小的数
指数级减少计算机运算量
但是...
这道题我还是没有得满分
明日再战[睡]
我一定是疯了
✋热门推荐