题目描述
本题是一个很简单的题目,目的是让同学们体验一下指数爆炸的威力。有了这个体验以后,相信大家在写算法时会更加重视时间复杂度这个因素的。
问题如下:
假设现在有一张厚度为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;
}
}