科学计数法

sky?? 2016-05-13 08:11:17
给出一个标准输入的正数(开头末尾没有多余的0),输出其科学计数法表示结果。比如:输入0.000002,输出2e-6;输入123.456,输出1.23456e2;输入123456,输出1.23456e2
用%e或%E输出会有零 怎么办
...全文
529 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2016-05-27
  • 打赏
  • 举报
回复
使用9楼代码。
赵4老师 2016-05-27
  • 打赏
  • 举报
回复
引用 14 楼 qq_34598319 的回复:
[quote=引用 13 楼 zhao4zhong1 的回复:] 提醒12楼:这段代码会在输入100.2的时候,错误地输出1.2e2;而不是正确的1.002e2
为什么啊[/quote]
sscanf("002","%d",&x);//x==2,前面的两个0被错误地去掉了
sky?? 2016-05-27
  • 打赏
  • 举报
回复
引用 13 楼 zhao4zhong1 的回复:
提醒12楼:这段代码会在输入100.2的时候,错误地输出1.2e2;而不是正确的1.002e2
为什么啊
赵4老师 2016-05-19
  • 打赏
  • 举报
回复
提醒12楼:这段代码会在输入100.2的时候,错误地输出1.2e2;而不是正确的1.002e2
赵4老师 2016-05-18
  • 打赏
  • 举报
回复
《致命Bug——软件缺陷的灾难与启示》
707wk 2016-05-18
  • 打赏
  • 举报
回复
引用 7 楼 zhao4zhong1 的回复:
改进5楼代码使其支持负数:
可这个有范围限制...
赵4老师 2016-05-18
  • 打赏
  • 举报
回复
引用 8 楼 qq423399099 的回复:
帮赵老师断个贴
大恩要言!Orz 纠正7楼代码的一个严重bug!:
#include <stdio.h>
#include <string.h>
void trim0(char *s) {
//  2.000000e-006→2e-6
//  1.234560e+002→1.23456e2
//  1.234560e+005→1.23456e5
//  1.000000e+000→1e0
// -1.000000e+000→-1e0
// -1.002000e+002→-1.002e2
    char x[40];
    char E[2];
    int z,e,i;
    if (4==sscanf(s,"%d.%39[0-9]%1[Ee]%4d",&z,x,E,&e)) {
        i=strlen(x)-1;
        while (1) {
            if ('0'==x[i]) {
                x[i]=0;
                if (i<=0) break;
                i--;
            } else break;
        }
        if (i<=0) {
            sprintf(s,"%de%d",z,e);
        } else {
            sprintf(s,"%d.%se%d",z,x,e);
        }
    }
}
int main() {
    char s[40];
    double d;

    while (1) {
        printf("Input a float number(0 to exit):");
        fflush(stdout);
        rewind(stdin);
        if (1==scanf("%lf",&d)) {
            if (0.0==d) break;
            sprintf(s,"%e",d);
            trim0(s);
            printf("%s\n",s);
        }
    }
    return 0;
}
//Input a float number(0 to exit):0.000002
//2e-6
//Input a float number(0 to exit):123.456
//1.23456e2
//Input a float number(0 to exit):123456
//1.23456e5
//Input a float number(0 to exit):1
//1e0
//Input a float number(0 to exit):-1
//-1e0
//Input a float number(0 to exit):-100.2
//-1.002e2
//Input a float number(0 to exit):0
//
小灸舞 版主 2016-05-18
  • 打赏
  • 举报
回复
帮赵老师断个贴
sky?? 2016-05-18
  • 打赏
  • 举报
回复
解决了 谢谢各位 #include<stdio.h> #include<string.h> void main() { void trim(char*s); float i; char s[20]; while(scanf("%f",&i)!=EOF){ if(i==0) { printf("0\n"); continue;} else{ sprintf(s,"%e",i); trim(s); printf("%s\n",s);} } } void trim(char*s) { int z,x,e; sscanf(s,"%d.%6de%d",&z,&x,&e); if(x==0){ sprintf(s,"%de%d",z,e);} else{ while(x%10==0) x=x/10; sprintf(s,"%d.%de%d",z,x,e); } }
赵4老师 2016-05-17
  • 打赏
  • 举报
回复
改进5楼代码使其支持负数:
#include <stdio.h>
#include <string.h>
void trim0(char *s) {
//  2.000000e-006→2e-6
//  1.234560e+002→1.23456e2
//  1.234560e+005→1.23456e5
//  1.000000e+000→1e0
// -1.000000e+000→-1e0
    char t[40];
    int z,x,e;
    sscanf(s,"%d.%6de%4d",&z,&x,&e);
    if (0==x) {
        sprintf(t,"%de%d",z,e);
    } else {
        while (1) {
            if (x%10==0) x/=10; else break;
        }
        sprintf(t,"%d.%de%d",z,x,e);
    }
    strcpy(s,t);
}
int main() {
    char s[40];
    double d;

    while (1) {
        printf("Input a float number(0 to exit):");
        fflush(stdout);
        rewind(stdin);
        if (1==scanf("%lf",&d)) {
            if (0.0==d) break;
            sprintf(s,"%e",d);
            trim0(s);
            printf("%s\n",s);
        }
    }
    return 0;
}
//Input a float number(0 to exit):0.000002
//2e-6
//Input a float number(0 to exit):123.456
//1.23456e2
//Input a float number(0 to exit):123456
//1.23456e5
//Input a float number(0 to exit):1
//1e0
//Input a float number(0 to exit):-1
//-1e0
//Input a float number(0 to exit):0
//
赵4老师 2016-05-16
  • 打赏
  • 举报
回复
作为一个C程序员,对 scanf,sscanf,fscanf printf,sprintf,fprintf 这类函数的用法,还是要做到“拳不离手,曲不离口”的。
赵4老师 2016-05-16
  • 打赏
  • 举报
回复
这个世界上最大的差别和最远的距离都存在于“说”和“做”之间。
//输入0.000002,输出2e-6;输入123.456,输出1.23456e2;输入123456,输出1.23456e5
#include <stdio.h>
#include <string.h>
void trim0(char *s) {
//  2.000000e-006→2e-6
//  1.234560e+002→1.23456e2
//  1.234560e+005→1.23456e5
//  1.000000e+000→1e0
    char t[40];
    int z,x,e;
    sscanf(s,"%1d.%6de%4d",&z,&x,&e);
    if (0==x) {
        sprintf(t,"%1de%d",z,e);
    } else {
        while (1) {
            if (x%10==0) x/=10; else break;
        }
        sprintf(t,"%1d.%de%d",z,x,e);
    }
    strcpy(s,t);
}
int main() {
    char s[40];
    double d;

    while (1) {
        printf("Input a float number(0 to exit):");
        fflush(stdout);
        rewind(stdin);
        if (1==scanf("%lf",&d)) {
            if (0.0==d) break;
            sprintf(s,"%e",d);
            trim0(s);
            printf("%s\n",s);
        }
    }
    return 0;
}
//Input a float number(0 to exit):0.000002
//2e-6
//Input a float number(0 to exit):123.456
//1.23456e2
//Input a float number(0 to exit):123456
//1.23456e5
//Input a float number(0 to exit):1
//1e0
//Input a float number(0 to exit):0
//
赵4老师 2016-05-14
  • 打赏
  • 举报
回复
先用sprintf输出到字符串,再自写函数去掉0,最后用printf输出。
lm_whales 2016-05-14
  • 打赏
  • 举报
回复
转为浮点数,要考虑浮点误差 不如直接在字符串之间转换
paschen 2016-05-14
  • 打赏
  • 举报
回复
格式具体说明及特殊用法参看:http://en.cppreference.com/w/c/io/fprintf
lm_whales 2016-05-13
  • 打赏
  • 举报
回复
自行处理 这不必转为浮点数,或者整数表示 直接在 字符串形式之间转换就可以了

70,020

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧