C语言求纠错!科学记数法对于非常大或者非常小的数据,我们通常用科学记数法来表示.例如在科技文献和电脑中经常遇到的 2.3×106 (计算机中的科学记数法表示为:2.3E6),或者 9.18×10-5 (科

来源:学生作业帮助网 编辑:作业帮 时间:2024/05/01 13:21:34

C语言求纠错!科学记数法对于非常大或者非常小的数据,我们通常用科学记数法来表示.例如在科技文献和电脑中经常遇到的 2.3×106 (计算机中的科学记数法表示为:2.3E6),或者 9.18×10-5 (科
C语言求纠错!科学记数法
对于非常大或者非常小的数据,我们通常用科学记数法来表示.例如在科技文献和电脑中经常遇到的 2.3×106 (计算机中的科学记数法表示为:2.3E6),或者 9.18×10-5 (科学记树法表示:9.18E-5)这种类型的数据.
输入:用科学记数法表示的数据.即为符合C语言表示的科学记数法表示.
输出:该数据的双精度表示
说明:1.输入数据的精度不高于小数点后50位.
2.输入数据时,在实数和幂之间有空格进行分隔,空格个数不定.
3.结果保留到小数点后8位,如不足8位用0补足,超过8位则截断,不进行四舍五入的处理.
友情提示:此题有点难啊!建议大家对问题要进行分析,分解为若干个小步骤,然后各个击破之.现在不要急于完成此题,待积累一定编程经验后再做.
编程思路:1.以字符方式一个一个读取输入数据,将尾数部分存入一个字符串,将指数部分转换为整数保存.尾数部分不要保存为实型数,因为尾数的小数部分可能很大,用实型数保存精度不够.
2.检查尾数字符串中是否有小数点,如果输入的尾数没有小数点,则在字符串中插入小数点.
3.根据给定的指数值移动小数点,可能有以下情况:
(1)指数为正,右移小数点;在移动过程中已到字符串尾,则需要补0.
(2)指数为负,左移小数点;在移动过程中已到字符串首,则要将字符串整体右移一位,在字符串首补0.
4.找到现在小数点的位置,再向后数8个字符,如果后面数字字符的个数不够8个则补0,小数点后8个数字字符的后面是字符串结束标志.
5.输出字符串.
建议采取渐增式的开发方法,编程过程中,完成以上一步后进行调试,正确后再编下一步的程序.
#include
#include
int main(int argc,char *argv[])
{int i,c,d;
float a;
char b;
scanf("%f %c %d",&a,&b,&c);
if(c==0)
printf("%.8f\n",a);
else {
if(c>0)
{ for(i=1;i

C语言求纠错!科学记数法对于非常大或者非常小的数据,我们通常用科学记数法来表示.例如在科技文献和电脑中经常遇到的 2.3×106 (计算机中的科学记数法表示为:2.3E6),或者 9.18×10-5 (科
呵呵!编程思路那里已经说了输入的尾数部分不要直接用浮点数去接.LZ问题中的发生了自动四舍五入的情况,极可能就是发生在用浮点数进行输入的时候.其次,在这里绝对不要用 float 类型,float 类型浮点数充其量只能保证 6~7位的十进制有效数字,在这里是绝对不够用的.用 double 类型吧.(足够保证16位数哦!)
正统的方法应该还是把尾数部分读进一个字符串里,在字符串里找小数点的位置,然后把多于8位数的多余尾数去掉.处理小数点和截掉多余尾数这两步应该就是题目真正要考验的吧.仔细想想处理办法.处理完的尾数可以用一个 sscanf(mantissa_str, "%lf", &mantissa_dbl); 可以直接把尾数转成正确的 double 浮点数.后面对指数的处理LZ做得很好了.