1024

作者: 笔墨流年乱浮生 | 来源:发表于2018-09-11 11:21 被阅读0次

    //1024 科学计数法(20 分)
    //科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式 [+-][1-9].[0-9]+E[+-][0-9]+,即数字的整数部分只有 1 位,小数部分至少有 1 位,该数字及其指数部分的正负号即使对正数也必定明确给出。
    //
    //现以科学计数法的格式给出实数 A,请编写程序按普通数字表示法输出 A,并保证所有有效位都被保留。
    //
    //输入格式:
    //每个输入包含 1 个测试用例,即一个以科学计数法表示的实数 A。该数字的存储长度不超过 9999 字节,且其指数的绝对值不超过 9999。
    //
    //输出格式:
    //对每个测试用例,在一行中按普通数字表示法输出 A,并保证所有有效位都被保留,包括末尾的 0。
    //
    //输入样例 1:
    //+1.23400E-03
    //输出样例 1:
    //0.00123400
    //输入样例 2:
    //-1.2E+10
    //输出样例 2:
    //-12000000000

    C:
    第一种方法:参考自dulongxiang

    #include <stdio.h>
    #include <string.h>
    int main(int argc, const char * argv[]) {
        char a[10000];
        scanf("%s", a);
        if (a[0] == '-') printf("-");
        int n = strlen(a);
        int zhishu = 0;
        int pos = 0;
        //找到E
        for (int i = 0; i < n; i++) {
            if (a[i] == 'E')  pos = i;
        }
        //确定指数
        for (int i = pos + 2; i < n; i++) {
            zhishu = zhishu * 10 + (a[i] - '0');
        }
        if (zhishu == 0) {//如果指数=0,输出'E'前的数字
            for (int i = 0; i < pos; i++) {
                printf("%c",a[i]);
            }
        }
        if (a[pos+1] == '-') {//如果指数<0,即0.+补0+数据
            printf("0.");//先输出"0."
            for (int i = 0; i < zhishu - 1; i++) {//输出(指数-1)个"0",即补0
                printf("0");
            }
            printf("%c",a[1]);//补0后,输出a[1]
            for (int i = 3; i < pos; i++) {//由于a[2]是'.',所以输出a[3]到a[pos]之间的数字
                printf("%c",a[i]);
            }
        }else//如果指数>0,如果指数>位数,不输出0且补0;如果指数<位数,在某个位置输出'.',且补一定数量的'0'
        {
            for (int i = 1; i < pos; i++) {//对'.'的处理
                if (a[i] == '.') continue;
                printf("%c",a[i]);//输出非'.'的数字
                if (2 + zhishu == i) {//i是索引,'.'是2,如果'.'(2) + 指数 并且 后续还有数字的话,需要输出'.'
                    if (pos - 1 == i) break;//如果后续没有数字的话,就不需要加'.',否则需要
                    printf(".");
                }
            }
            for (int i = 0; i < zhishu - (pos - 3); i++) {//a[0]是符号位,a[1]是第一位数字,a[2]是'.'
             //pos-3来判断'.'后有几个数字,指数 - 相应数字 = 需要补的'0'的数量
                printf("0");
            }
        }
        return 0;
    }
    

    PS:练习量还不够,考虑不够全面,思路看了较长时间

    /*指针*/
    #include <stdio.h>
    int main()
    {
        char num[10000],*p = num;//*p指向num[0],对*p移位可以取数组中其他值
        int exp;
        scanf("%[^E]E%d",num,&exp);//这种用法是第一次见,%[^E]表示读入字符终止于E,然后读入E,读入E后的整数
        if (*p++ == '-') printf("-");//如果num[0] == '-'则输出'-',否则不输出,且判断后p指向num[1]
        if (exp >= 0) {//指数大于0的情况下
            putchar(*p);//输出num[1],即输出第一位数字
            for (p += 2; exp; exp--)     putchar(*p ? *p++ : '0');//p右移2位,即指向'.'后的第一位数字
            //当指数>0 时,此时p没有值时需要补0,有值的话直接输出该值
            if (*p) {//当0补完后在E前还有数字
                putchar('.');//输出'.'
                while (*p) {//继续输出后续数字
                    putchar(*p++);
                }
            }
        }
        if (exp < 0) {//指数小于0时先输出'0.'
            printf("0.");
            for (exp++; exp; exp++) {//这里我认为是这样理解的:判断条件是 指数=0时 结束循环
                //负数在逻辑运算中  结果是真,所以即使指数是负数,但是仍然满足判断条件
                putchar('0');
            }
            for (; *p; p++) {
                if (*p != '.') {//输出非'.'的数字
                    putchar(*p);
                }
            }
        }
        return 0;
    }
    
    

    参考自OliverLew

    PS:思路简单粗暴,并且居然用C都实现了,同为研究生,汗颜。

    相关文章

      网友评论

          本文标题:1024

          本文链接:https://www.haomeiwen.com/subject/wxoygftx.html