回 帖 发 新 帖 刷新版面

主题:科学记数法

科学记数法
输入:用科学记数法表示的数据。即为符合C语言表示的科学记数法表示。
输出:该数据的双精度表示
说明: 1.输入数据的精度不高于小数点后50位。
      2.输入数据时,在实数和幂之间有空格进行分隔,空格个数不定。
      3.结果保留到小数点后8位,如不足8位用0补足,超过8位则截断,不进行四舍五入的处理。
编程思路:1.以字符方式一个一个读取输入数据,将尾数部分存入一个字符串,将指数部分转换为整数保存。尾数部分不要保存为实型数,因为尾数的小数部分可能很大,用实型数保存精度不够。
         2.检查尾数字符串中是否有小数点,如果输入的尾数没有小数点,则在字符串中插入小数点。
         3.根据给定的指数值移动小数点,可能有以下情况:
            (1)指数为正,右移小数点;在移动过程中已到字符串尾,则需要补0。
            (2)指数为负,左移小数点;在移动过程中已到字符串首,则要将字符串整体右移一位,在字符串首补0。
         4.找到现在小数点的位置,再向后数8个字符,如果后面数字字符的个数不够8个则补0,小数点后8个数字字符的后面是字符串结束标志。
         5.输出字符串。
我的答案:
运行勉强可以,不知哪里不妥
#include "stdio.h"
#include"string.h"
main()
{ char s[200],s1[200],s2[9]=".00000000",s3[80];int x,i,m,k=0,n,j;
  gets(s);
  for(i=0;s[i]!=' ';i++)
   { s1[i]=s[i];
     if(s1[i]=='.')
       { k=1;
     m=i;
       }
    }
  s1[i]='\0';
  n=i;
  if(k==0)
      { s1[i]='.';
    s1[i+1]='\0';
    m=i;
      }
  for(;s[i]!='\0';i++)
    { if(s[i]>'0'&&s[i]<='9')
        { if(s[i-1]=='-') x=-s[i]+'0';
          else if(s[i-1]==' ') x=s[i]-'0'; 
         }
     }
  if(x>0)
     { m=m+x;
       if(m>n-1)
        { i=0;
          while(s1[i]=='.'||s1[i]=='0')  i++;
          for(j=0;i<n;i++,j++)
      { if(s1[i]!='.') s3[j]=s1[i];
            else j--;
       }
      for(;i<m+1;j++,i++) s3[j]='0';
          s3[j]='\0';
         }
        if(m<=n-1)
         { for(j=1,i=m+1;i<n&&j<9;i++,j++)
             s2[j]=s1[i];
           i=0;
           while(s1[i]=='.'||s1[i]=='0') i++;
           for(j=0;i<m+1;i++,j++)
        { if(s1[i]!='.') s3[j]=s1[i];
              else j--;
         }
          }
        strcat(s3,s2);
      }
   if(x<0)
     { if(m>=-x)
         { m=m+x;
       for(i=m,j=1;i<n;i++,j++) s2[j]=s1[i];
       for(i=0;i<m;i++) s3[i]=s1[i];
          }
       else { for(j=-x-m+1,i=0;i<n&&j<9;i++,j++)
               { if(s1[i]!='.') s2[j]=s1[i];
                 else j--;
                }
          strcpy(s3,"0");
        }
       strcat(s3,s2);
      }
    printf("%s",s3);
}

回复列表 (共8个回复)

沙发

请把问题提得具体一些,是有输入得到的输出不对还是?

板凳


不太完善的程序

3 楼

“不太完善”很宽泛……比如说你想实现什么,或者你觉得应该有什么,但是试着添加之后结果跟预期不一致

4 楼

你是不是想得到一个数的科学计算法表示,比如123456.7890123表示成 1.23456789  5(指数)
                                          12345.67      表示成 1.23456700  4

5 楼


倒过来的

6 楼

这是一道作业题,在tc上能运行正确,但在网络教室里提交后显示“无效内存引用”,不知为什么

7 楼


[code=c]
s2[9]=".00000000"
[/code]
这个有问题 下标越界了 因为还有个'\0'
应该是s2[10]=".00000000"

8 楼


哦,原来是这样,3k3k3k3k3k3k3k

我来回复

您尚未登录,请登录后再回复。点此登录或注册