指数爆炸:求纸张折叠厚度超过地月距离的折叠次数

题目描述
本题是一个很简单的题目,目的是让同学们体验一下指数爆炸的威力。有了这个体验以后,相信大家在写算法时会更加重视时间复杂度这个因素的。

问题如下:

假设现在有一张厚度为1mm的纸,纸质非常柔软,可以对折无数次。每对折1次,厚度便翻一番。

已知地球距月球约39万公里,请问至少对折多少次后厚度能超过地月距离呢?(在往下看之前,请你先大致猜一个数字,写下来。待解答后进行对比)

本题为了保证测试数据的多样性,地月距离可以在一个取值范围内任意输。

输入
以km为单位,输入一个地月距离值a

a大于等于1 km,且小于1 000 000 000 km。

输出
输出对折的最小次数。

样例输入 Copy
1
样例输出 Copy
20
提示
本题可以不用64位数据类型。但若单位用的不一样,可能会用到64位类型数据。

Q: 数据超过了int的表示范围,要用64位数据,变量定义要注意什么?

A: 编译环境不同,定义不同。但在OJ上提交时,需改成long long类型再提交。

l 在VC6中调试,变量定义用__int64类型,输入输出格式用%I64d。(注意:__int64前是2条下划线,%I64d中的I是字母i的大写)

l 在windows版的Codeblocks中调试,变量定义用__int64类型或long long,输入输出格式用%I64d

l 在linux版的Codeblocks中调试或在OJ上提交时,变量定义只能用long long类型,输入输出格式用%lld。(注意:%lld中的ll是long long的2个头字母)

代码一
#include <stdio.h>
#include <math.h>
int main()
{
int n=0,a,l;
double t;
scanf("%d",&a);
do{
t=pow(2,n)*0.000001;
n++;
}while(t<=a);
printf("%d",n-1);
}

代码二
#include <stdio.h>
#include <math.h>
int main()
{
int n=0,a,l;
double t=0.000001;
scanf("%d",&a);
do{
t=2*t;
n++;
}while(t<=a);
printf("%d",n);
}

代码三
#include<stdio.h>
#include<stdlib.h>
int main()
{
int n,i=0;
double a;
scanf("%lf",&a);
if(a>=1&&a<=1000000000)
{
do
{ i++;
a=a/2;
}while(a>=0.000001);
n=i;
printf("%d\n",n);
return 0;
}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值