1024

//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 
#include 
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 
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)