您的位置:首页 > 编程语言 > C语言/C++

pat乙级真题:1024. 科学计数法 (20)

2017-11-20 01:03 429 查看

题目连接

           
点击打开链接




解题思路

把输入的科学计数法字符串拆分为指数部分和数字部分,并把指数部分的字符串转化为数字num。对指数部分为正和为负时分别处理。为负时,小数点前移,输出0.后

继续输出num-1个0,之后把zhengshu字符串的非.部分全部输出即可。若指数部分为正时,分两种情况处理。一种是数字没有小数部分了,那就只需要把数字部分中的小数点后的数字分别

往前移动一个位置,并把小数点放在zhengshu[num+1]的位置。由于最初已经把zhengshu字符串数组全部用'0'初始化了,因此这时只需要把zhengshu字符串一直输出到小数点

所在的位置即可。一种情况是数字仍然有小数部分,那就只需要吧zhengshu字符串从头输出到尾即可。

 

#include <stdio.h>  
#include <stdlib.h>  
#include <string.h>  
#include <math.h>

/*******************************************************************************************************
*函数功能:输入,并拆分出数字部分、指数部分。
*变量:
*      num----存储输入的科学计数法字符串
*      _zhengshu ---存储数字部分
*      _zhishu----存储指数部分
*      flag----对应指数符号。1 -- +    0 --  -
*      j ----  j最终返回的是指数部分该放'\0'的位置。
*
**********************************************************************************************************/
int inputAndDeal(char _num[], char _zhengshu[], char _zhishu[]){
    int i, j,flag;
    scanf("%s", _num);
    for (i = 1; _num[i] != 'E'; i++){
        _zhengshu[i - 1] = _num[i];
    }
    _zhengshu[i - 1] = '\0';
    i++;

    if (_num[i] == '+')
        flag = 1;
    else
        flag = 0;
    i++;
    j = 0;
    for (; _num[i]; i++)
        _zhishu[j++] = _num[i];
    _zhishu[j] = '\0';
    return flag;
}

int main(){
    char num[10002],
        zhengshu[30002],
        zhishu[10002];
    memset(zhengshu, '0', 30002);
    int i, j, flag, zhishu_num, zhengshu_len;
    flag = inputAndDeal(num, zhengshu, zhishu);

    if (num[0] == '-')
        printf("%c", num[0]);

    zhishu_num = atoi(zhishu);
    zhengshu_len = strlen(zhengshu);

    if (flag){     //指数部分为正数,因此处理小数点后移的情况  
        zhengshu[zhengshu_len] = '0';   //用'0'替换'\0'  
        for (i = 0; i<zhishu_num; i++)    //整数部分前移  
            zhengshu[i + 1] = zhengshu[i + 2];
        zhengshu[i + 1] = '.';         //插入小数点  
        if (zhengshu_len - 2 > zhishu_num){ //若最终得到的数字还有小数  
            for (j = 0; j<zhengshu_len; j++)
                printf("%c", zhengshu[j]);
        }
        else{                             //若最终得到的数字没有小数部分  
            for (j = 0; zhengshu[j] != '.'; j++)
                printf("%c", zhengshu[j]);
        }
    }
    else{                                //指数部分为负,即小数点前移。  
        zhengshu[zhengshu_len] = '\0';
        printf("0.");
        for (i = 0; i<zhishu_num - 1; i++)
            printf("0");
        for (i = 0; zhengshu[i]; i++){
            if (zhengshu[i] != '.')
                printf("%c", zhengshu[i]);
        }
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c语言 pat 乙级