您的位置:首页 > 编程语言 > C语言/C++

UVA 11809 - Floating-Point Numbers

2018-01-25 01:00 337 查看




好了,两张贴图扔上来了(第一次试),大概说一下什么意思,浮点数的储存方式(阶码和尾数,尾数是少一个1的,阶码有表示正负的0/1),然后举个栗子姐姐:double是8个字节,我们现在随便malloc,然后尾数和阶码的数量随便定(0,9闭区间和1,30闭区间)我们输入一个最大值,再去判定这个最大值时尾数和阶码是几位(英语菜,小样看了半天才看懂......)然后,我们会发现2的30次方的时候(极限情况,300行输入)根本装不下(这只是10的次方项),所以我们肯定要砍点了,所以我们直接就不运算10的2的30次方的次方,直接log10()扔出来2的a次方,然后再加上一个log10(b)————(前面那个尾数),然后存入二维数组依次的尾数和阶码的那个position,打表完直接暴力搜索。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
int main()
{
//freopen("in.txt","r",stdin);
double s[11][32];
memset(s,0,sizeof(s));
char n[100];
double a;
int b,i;
int c,d;//c是前面的数量,d是后面的
double e,f;//e记录前面的最大值,f记录后面的次方数
for(c=0; c<10; c++)
{
for(d=1; d<31; d++)
{
e=1-pow(2,-1-c);
f=pow(2,d)-1;//多少次方
s[c][d]=f*log10(2)+log10(e);
}
}
int flag;
double x;
while(1)
{
flag=0;
scanf("%s",n);
for(i=0;n[i]!='\0';i++)
if(n[i]=='e'){n[i]=' ';break;}
sscanf(n,"%lf %d",&a,&b);
//printf("%lf %d",a,b);
if(a==0&&b==0)break;
x=b+log10(a);
for(c=0; c<10; c++)
{
for(d=1; d<31; d++)
{
if(fabs(s[c][d]-x) <1e-5)
{
printf("%d %d\n",c,d);
flag=1;
break;
}
}
if(flag==1)break;
}
// printf("yes");
}
return 0;
}


总结一下:

1.开始全无思路,翻译完一圈之后小样都没看懂,再看......

2.看懂了,开始设计情况,设计完发现没输出,有了那行cout<<yes;

3.数据跑完小样不对,第二个小样出的7,6,之前开1e-3,qq截图出7,6和8,6的差别,(变成了1e-5)

4.开始打表是c=1......好吧,菜。

综上所述:草稿纸确实是个好东西,(虽然我草稿纸天马行空),但是当时逻辑清晰多了。

(开始还比较飘打算不用pow,后来一想还有负数情况......算了,写个算平方的好麻烦......)

当时感觉pow有误差的嘛,后来想想要是真自己写一个都得用double,学校的题那是比较低端的int类型平方版本,尽量无误差。(误导啊)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息