1024科学计数法
科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式 [±][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
思路:我们首先要判断数字得正负和指数的正负,这样方便我们后续是在让小数点前移还是后移。因此获取到正负之后,还要将数字全部数字都获取到,然后还要得到指数是多少,至此,我们已经完成前面的所有工作了,我们现在只需要判断前移还是后移,然后移动多少位,最后还需要补多少零,该任务就算完成。
该算法本人认为比较优,如果有更好的想法,欢迎q我!
代码如下(编译器是dev,语言是C语言):
#include<stdio.h>
#include<stdbool.h>
char temp;
int a[100005],zhishu = 0;
int i = 0,j;
int szzf = 0,zszf = 0;//数字正负,指数正负,0表示正,1表示负
int controlzf = 0,controlsz = 0;//controlzf用于控制正负是谁的,controlsz用于控制现在输入的是指数还是数字
int main(){
while(true){
scanf("%c",&temp);
if(temp == '\n'){
break;
}
if((temp == '+')||(temp == '-')){
if(controlzf == 0){
if(temp == '+'){
szzf = 0;
}else{
szzf = 1;
}
controlzf = 1;
}else if(controlzf == 1){
if(temp == '+'){
zszf = 0;
}else{
zszf = 1;
}
}
continue;
}
if(temp == '.'){
continue;
}
if(temp == 'E'){
controlsz = 1;
continue;
}
if(controlsz == 0){
a[i++] = temp -48;
}else if(controlsz == 1){
zhishu = zhishu*10 +temp -48;
}
}
if(zszf == 0){
if(szzf == 0){
printf("%d",a[0]);
for(j = 1;j<i;j++){
if(zhishu == 0){
printf(".");
}
printf("%d",a[j]);
zhishu --;
}
if(zhishu >= 0){
for(j = 1;j<=zhishu;j++){
printf("0");
}
}
}else{
printf("-");
printf("%d",a[0]);
for(j = 1;j<i;j++){
if(zhishu == 0){
printf(".");
}
printf("%d",a[j]);
zhishu --;
}
if(zhishu >= 0){
for(j = 1;j<=zhishu;j++){
printf("0");
}
}
}
}else{
if(szzf == 0){
if(zhishu == 1){
printf("0.");
}else{
for(j = zhishu;j>=1;j--){
if(j == (zhishu-1)){
printf(".");
}
printf("0");
}
}
for(j = 0;j<i;j++){
printf("%d",a[j]);
}
}else if(szzf == 1){
printf("-");
if(zhishu == 1){
printf("0.");
}else{
for(j = zhishu;j>=1;j--){
if(j == (zhishu-1)){
printf(".");
}
printf("0");
}
}
for(j = 0;j<i;j++){
printf("%d",a[j]);
}
}
}
printf("\n");
return 0;
}