题目连接
解题思路
把输入的科学计数法字符串拆分为指数部分和数字部分,并把指数部分的字符串转化为数字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;
}