题目大意:给一个16位的数字,表示一个浮点数,按照规则转换成科学计数法表示。
解法:注释比较清楚了,注意浮点运算的四舍五入问题。
参考代码:
#include<iostream> #include<cmath> #include<cstdio> #include<iomanip> #include<string.h> using namespace std; int main(){ char in[16],out[16]; int i,j,n,exp,man,zero; double num; cout<<"Program 6 by team X"<<endl; //废话不能少,否则WA while(scanf("%s",in)!=EOF){ man=0; exp=0; zero=1; if(in[0]=='1')out[0]='-'; else out[0]=' '; for(i=1;i<8;i++){ exp=exp<<1; //注意,移位的时候后面不能再跟算式,否则出错 exp+=(in[i]-'0'); //处理的是字符,要用ASCii码比较 if(in[i]!='0')zero=0; } exp=exp-63; for(i=8;i<16;i++){ man=man<<1; man+=(in[i]-'0'); if(in[i]!='0')zero=0; } num=(1+double(man)/256)*pow(2.0,exp); exp=0; if(num>10-1e-6){ while(num>10-1e-6){ num/=10; exp++; } } else if(num<1.0+1e-6){ while(num<1.0+1e-6){ num*=10; exp--; } } if(zero)cout<<" 0.000000e+000"; else{ cout<<out[0]; printf("%.6fe",num); if(exp>=0){ cout<<"+0"; if(exp<10)cout<<'0'; cout<<exp; } else{ cout<<"-0"; if(exp>-10)cout<<'0'; cout<<-exp; } } cout<<endl; } cout<<"End of program 6 by team X"; return 0; }