浮点数
都是眼泪有木有
刚开始题就没看懂
百度补了一下浮点数的储存
想起紫书里一个例子
for(double i=0.0;i!=10;i+=0.1)
printf("%llf\n",i);
不要目测答案,一定要编译测试一下
(扯远了
-------------------回归分割线(回归线)----------------
这题思路还是挺清晰的
浮点数分两个部分 那就分别计算两个部分
后面的指数部分嘛
2^ (1,3,7,15....)
每一项都等于前一项的平方*2
然后注意科学计数法的 前面那个数是大于等于1小于10的
每次计算后要调整一下
浮点数的前一部分直接用函数就算出来了
遍历所有的m和e
我这里是 befo 和 bee (迷の变量名
查找e相等而且m相差最小的那个解
说到输入,我本来都想手写一个字符串转化为浮点数的while了
还好晓楠告诉我可以用sscanf
用法如代码
-----------------------------------以下是控诉反思------------------
这题调了2天,WA六次
刚开始卡题目半天百度浮点数的表示方法勉强理解题意
二进制表示小数表示没看懂,不过知道怎么算了
样例的两组数据能逆向求出来
然后写遍历比较的部分
这也是悲剧的开始。。。。
比较的时候没有注意格式
科学计数法的前面那个数没有处理好
要重新调整一下的我没有去调,而且刚开始写的时候
指数部分的调整也没弄好
当时是凑合能用,但是感觉有点不对
一但改动一下就是死循环,于是就没改
于是也就WA了六次
最后重新写了一遍,终于AC
介个吧,思路清晰而且刚开始写的很乱的时候不妨重写一遍
晓楠说这个可以直接用位运算 表示不会
位运算还是感觉略高大上
还有看到有取对数做的
同表示不会
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
double f(int n){
double ret=0;
n++;
double coul=1;
while(n--){
coul/=2;
ret+=coul;
}
return ret;
}
int e[31];
double arr[31];
int main(){
e[0]=0;
arr[0]=2;
for(int i=1;i<30;i++){
e[i]=e[i-1]*2;
arr[i]=arr[i-1]*arr[i-1]*2;
while(arr[i]!=0 && (arr[i]<1.0 || arr[i]>10.0)){
if(arr[i]<1.0){
arr[i]*=10;
e[i]--;
}
if(arr[i]>10){
arr[i]=arr[i]/10;
e[i]++;
}
}
}
double M;
int E;
char get[40];
while(~scanf("%s",get)){
char *p=strchr(get,'e');
*p=' ';
sscanf(get,"%lf %d",&M,&E);
if(M==0&&E==0) break;
int m=0,n=1;
double miss=10;
double befo;
int bee;
for(int i=0;i<10;i++){
for(int j=1;j<31;j++){
befo=f(i)*arr[j-1];
bee=e[j-1];
while(befo!=0 && (befo<1.0 || befo>10.0)){
if(befo<1.0){
befo*=10;
bee--;
}
else{
befo=befo/10;
bee++;
}
}
if(fabs(befo-M)<miss && bee==E){
miss=fabs(befo-M);
m=i,n=j;
}
}
}
printf("%d %d\n",m,n);
}
return 0;
}
以上。。。集训前第一套题勉强AK