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

PAT 乙等 1024 科学记数法 C语言

2017-05-08 22:03 85 查看

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


思路:

1.首先根据底数符号位输出整个数的符号,若为负号则输出‘-’,若为正不输出

2.在输入中找到E,将之后的指数截取出来

3.判断指数是正数还是负数:

     (1)若指数为负数,则根据指数大小在底数之前输出对应个数的0,输出完0后再输出底数,记得跳过底数中的小数点;若为-0。则直接输出底数

     (2)若指数为正数,若指数小于底数中小数点后的位数,若是则将小数点右移指数位,之后再输出剩余的底数。若指数大于底数中小数点后的位数,则

               在输出完底数后在输出剩余的0;若指数为+0,则直接输出底数

一、起始变量

1.num【10000】接受字符串

2.e_mark,用于记录输入字符串中E的位置,以此来区分指数和底数

3.index_flag,用于记录指数的符号位

4.index_ch,用于记录指数字符串

5.index,用于记录将index_ch转换的指数的整数形式

二、代码

#include "stdio.h"
#include "math.h"
#include "string.h"
int main()
{
char num[10000];
scanf("%s",num);
int i;

//若为负,直接打印符号;
if(num[0] == '-')
{
printf("-");
}

//找到E的下标,用于分割底数和指数
int e_mark;
for(i = 1; i < strlen(num); i++)
{
if(num[i] == 'E')
{
e_mark = i;
break;
}
}//此循环结束后,下表位于E的位置

i++;//将下标移动到指数的符号位

//记录指数符号位
char index_flag = num[i];

//获得指数字符串
char index_ch[5];//指数最多有4位,增加一位存储\0
int j = 0;
for(i = i + 1; i < strlen(num); i++)//初始化为i+1,即将i移动到指数的第一位数字
{
index_ch[j] = num[i];
j++;
}

//将指数字符串转换为整形指数
int index = 0;
//初始指数权重,即为指数长度减一,比如指数为1234,则1权重为为10的(4-1)次方
int index_right = strlen(index_ch) - 1;
for(i = 0; i < strlen(index_ch); i++)
{
index += (index_ch[i] - '0') * pow(10,index_right);
index_right--;
}//至此已经计算完指数

if(index_flag == '-')//讨论指数为-的时候
{
if(index != 0)
{
printf("0.");//只要指数小于0,就会产生‘0.’
for(i = 0; i < index - 1; i++)//因为已经输出“0.”了,故少输出一个零
{
printf("0");
}
for(i = 1; i < e_mark; i++)//输出num中的底数,从1开始,0位为底数的符号位,已经在刚开始输出过
{
if(i == 2)//跳过科学记数法的小数点
{
continue;
}
printf("%c",num[i]);
}
}
else if(index == 0)//指数为0
{
for(i = 1; i < e_mark; i++)//输出num中的内容
{
printf("%c",num[i]);
}
}

}
else if(index_flag == '+')
{
if(index != 0)
{
if(index < e_mark - 3)//指数小于小数点后底数的位数
{
for(i = 1; i < e_mark ; i++)
{
if(i == 2)//跳过小数点
{
continue;
}
else if(i == 2 + index)//在指数为0的位置输出小数点
{
printf("%c",num[i]);
printf(".");
}
else
{
printf("%c",num[i]);
}

}
}
else if(index == e_mark - 3) //指数等于小数点后底数位数
{
for(i = 1; i < e_mark ; i++)
{
if(i == 2)//跳过小数点
{
continue;
}
else
{
printf("%c",num[i]);
}

}
}
else if(index > e_mark - 3)//指数大于小数点后底数位数
{
for(i = 1; i < e_mark; i++)
{
if(i == 2)//跳过底数小数点
{
continue;
}
else
{
printf("%c",num[i]);
}
}
//因为指数大于小数点之后的底数位数,在输出完底数后要再输出0
for(i = 0; i < index - (e_mark - 3); i++)
{
printf("0");
}
}
}
else if(index == 0)//指数为0
{
for(i = 1; i < e_mark; i++)//输出num中的内容
{
printf("%c",num[i]);
}
}

}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  PAT PAT 乙等 c语言