首页 > 试题广场 > 科学计数法 (20)
[编程题]科学计数法 (20)
  • 热度指数:16767 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式[+-][1-9]"."[0-9]+E[+-][0-9]+,即数字的整数部分
只有1位,小数部分至少有1位,该数字及其指数部分的正负号即使对正数也必定明确给出。

现以科学计数法的格式给出实数A,请编写程序按普通数字表示法输出A,并保证所有有效位都被保留。

输入描述:
每个输入包含1个测试用例,即一个以科学计数法表示的实数A。该数字的存储长度不超过9999字节,且其指数的绝对值不超过9999。


输出描述:
对每个测试用例,在一行中按普通数字表示法输出A,并保证所有有效位都被保留,包括末尾的0。
示例1

输入

+1.23400E-03

输出

0.00123400
啥头像
总体思路:
    模拟移位
    注意点:保持有效位数

代码如下:
#include <iostream>
#include <stdlib.h>

using namespace std;

int main()
{
    // 读入字符串,并输出第一位
    string str; cin >> str;
    if(str[0] == '-') {
        cout << "-";
    }

    // 提取指数位和底数位
    int ePos = str.find('E');
    int exp = atoi((str.substr(ePos+1)).c_str());
    string basicNumber = str.substr(1, ePos-1);

    // 模拟移位
    if(exp < 0) {
        basicNumber.erase(1, 1);
        basicNumber.insert(0, (-exp)-1, '0');
        cout << "0." << basicNumber << endl;
    } else {
        if(exp < (basicNumber.length()-2)) {
            basicNumber.erase(1, 1);
            basicNumber.insert(exp+1, 1, '.');
            cout << basicNumber << endl;
        } else {
            int n = exp-basicNumber.length()+2;
            basicNumber.insert(basicNumber.length(), n, '0');
            basicNumber.erase(1, 1);
            cout << basicNumber << endl;
        }
    }
    return 0;
} 


发表于 2015-10-19 20:04:18 回复(2)
import java.util.*;
import java.math.BigDecimal;
public class Main {
    public static void main(String[] args) {
        Scanner scan=new Scanner(System.in);
        BigDecimal s=scan.nextBigDecimal();
        System.out.println(s.toPlainString());
        scan.close();
    }
}

发表于 2015-12-26 22:55:15 回复(13)
#include <iostream>
#include <string>
#include <iomanip>
#include <math.h>
using namespace std;

int main ()
{
	string inStr, subStr1, subStr2;   
	char flag;   // 指数的符号
	int pos;   // 记录'E'字符的位置
	cin>>inStr;
	if('-' == inStr[0])
		cout<<"-";  // 小数符号位
	pos = inStr.find('E', 0);
	subStr1 = inStr.substr(1,pos-1);
	flag = inStr[pos+1];
	subStr2 = inStr.substr(pos+2,subStr1.size()-2-pos);
	int n = atoi(subStr2.c_str());
	subStr1.erase(subStr1.find('.'),1);
	int len = subStr1.size();
	if('+' == flag )  {
		if(n>=0 && n<len-1) 
			subStr1.insert(n+1, 1, '.');
		else 
			subStr1.insert(len, n-len+1, '0');	
		cout<<subStr1;
	}
	else {
		if(0 == n) {
			subStr1.insert(1, 1, '.');
			cout<<subStr1;
		}
		else {
			cout<<"0."<<setfill('0')<<setw(len+n-1)<<subStr1;
		}
	}

	return 0;
}

发表于 2015-09-19 14:56:29 回复(2)

import java.util.Collections;
import java.util.Scanner;

/**
 * @ClassName Main
 * @Description TODO
 * @Author Wlison
 * @Date 2020/3/11 9:38
 * @Version 1.0
 **/
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            String str = sc.nextLine();
            String[] es = str.split("E");
            int loc = Integer.parseInt(es[1].substring(1));
            String res = es[0].replace(".","");
            if (es[1].charAt(0)=='-') {
                res =  "0." + String.join("", Collections.nCopies(loc - 1, "0")) + res.substring(1);
            }else{
                if (loc+2<res.length()){
                    res = res.substring(1,loc+2)+"."+res.substring(loc+2);
                }else {
                    res = res.substring(1)+String.join("",Collections.nCopies(loc+2-res.length(),"0"));
                }
            }
            if (es[0].charAt(0)=='-'){
                System.out.println('-'+res);
            }else {
                System.out.println(res);
            }
        }
    }
}

发表于 2020-03-11 11:31:31 回复(1)
#include <iostream>
#include <string>
using namespace std;
int main()
{
    string s;
    while(cin>>s)
    {
        int dot=s.find('.');//小数点位置;
        int eIndex=s.find('E');//E位置;
        char integer=s[dot-1];//整数部分
        string decimal=s.substr(dot+1,eIndex-dot-1);//小数部分;
        string exp=s.substr(eIndex+2);//指数部分;
        int expInt=stoi(exp);
        char sig1=s[0];//最前面的符号
        char sig2=s[eIndex+1];//指数的符号
        string temp=integer+decimal;
        if(sig1=='-')   cout<<'-';
        if(sig2=='+')
        {
            if(decimal.size()<=expInt)
                cout<<temp<<string(expInt-decimal.size(),'0');
            else
                cout<<temp.substr(0,expInt+1)<<'.'<<temp.substr(expInt+1);
        }
        else
        {
            cout<<"0."<<string(expInt-1,'0')<<temp;
        }
    }
}
发表于 2018-05-14 20:05:42 回复(1)
import java.util.Scanner;

/**
 * 科学计数法
 * 题目描述
 * 科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式
 * [+-][1-9]"."[0-9]+E[+-][0-9]+,即数字的整数部分只有1位,小数部分至少有1位,
 * 该数字及其指数部分的正负号即使对正数也必定明确给出。现以科学计数法的格式给出实数A,
 * 请编写程序按普通数字表示法输出A,并保证所有有效位都被保留。
 * 输入描述:
 * 每个输入包含1个测试用例,即一个以科学计数法表示的实数A。该数字的存储长度不超过
 * 9999字节,且其指数的绝对值不超过9999。
 * 输出描述:
 * 对每个测试用例,在一行中按普通数字表示法输出A,并保证所有有效位都被保留,包括末尾的0。
 * 输入例子:
 * +1.23400E-03
 * 输出例子:
 * 0.00123400
 *
 * @author shijiacheng
 * @date 2018/2/1
 */
public class B1014ScientificCountingMethod {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str = sc.next();
        char[] chars = str.toCharArray();
        StringBuilder sb = new StringBuilder();
        if (chars[0] == '-') {
            sb.append("-");
        }
        int e = str.indexOf('E');
        String z = str.substring(e + 2, str.length());//指数
        String s = str.substring(3, e);
        int zeroCount = Integer.parseInt(z);
        if (chars[e + 1] == '-') {
            sb.append("0.");

            for (int i = 0; i < zeroCount - 1; i++) {
                sb.append("0");
            }
            sb.append(chars[1]);
            sb.append(s);
        } else {
            sb.append(chars[1]);
            if (zeroCount >= s.length()) {
                //没有小数点,后面补0
                sb.append(s);
                for (int i = 0; i < zeroCount - s.length(); i++) {
                    sb.append("0");
                }
            } else {
                String temp = s.substring(0, zeroCount);
                String temp2 = s.substring(zeroCount, s.length());
                sb.append(temp);
                sb.append(".");
                sb.append(temp2);
            }
        }
        System.out.println(sb.toString());
    }
}
发表于 2018-02-01 22:26:16 回复(0)
又是我来贴python版的了(Orz 重复了好多次)
优雅整洁,直观简练的python     ^_^

#coding=utf-8
s=raw_input()
num=s[1:].split("E")[0].replace(".","") #数值
point=s.find(".")-1 #相对数值小数点的位置
E=int(s.split("E")[1])  #指数
def solve():
	if E>=0:
		if point+E>len(num):
			return num+"0"*(point+E-len(num))
		else:
			ans=""
			for i in range(len(num)):
				if i==point+E:
					ans+="."+num[i]
				else:
					ans+=num[i]
			return ans
	else:
		if point+E<=0:
			return "0."+"0"*( -(point+E))+num
if s[0]=="-":
	print "-"+solve()
else:
	print solve()

喜欢python的同学可以关注我哦~~~   我们一起来学python
发表于 2016-01-22 16:20:33 回复(1)

分析

切入点

正则表达式[+-][1-9].[0-9]+E[+-][0-9]+给出本题关键。整数部分为(1-9)限制了0的情况。

  • 不论是什么样的字符串读取逻辑,其目的都是需要固定的几个数组或数字:

    • 实数符号,存为char,为+号不输出,-号应输出。

    • 实数部分,存入char数组,可以不需要含小数点,因为科学计数法固定为第一位后为小数点。

    • 指数正负号,存为char,用于后面移位的判断。

    • 指数部分,存为int,后面可直接作为判断边界。

分上述四部分读取并存入相应类型中。

  • 逻辑部分

不考虑指数为0(包含+0和-0)情况,因为无意义。

  1. 指数为正数时,进位后仍需要小数点,说明指数小于(实数位数-1)(小数点在第一位后,所以要减一),并将小数点放置实数char数组中指数+1位置。

  2. 指数为正数时,进位后不需要小数点,说明指数大于等于(实数位数-1),此时,可能需要补零,根据指数大于(实数位数-1)判断。

指数为正

    if (signE == '+'){//指数为正数
        if (expAbs < lenA - 1){//指数小于实数长度,则需要小数点,且位于expAbs + 1处
            for (int i = 0; i < lenA; i++){
                if (i == expAbs + 1){
                    printf(".");
                }
                printf("%c", A[i]);
            }
        }
        else{//不需要小数点,但是可能需要要添0
            for (int i = 0; i < lenA; i++){
                printf("%c", A[i]);
            }
            for (int j = 0; j < expAbs - lenA + 1; j++){
                printf("0");
            }
        }
    }
  1. 指数为负数时,一定输出0.xxx...类型,所以先输出0.,再判断是否继续输出0,根据(指数-1)是否大于0判断,然后输出实数char数组。

指数为负

    else{//指数为负数,不考虑 -0 情况,因为没意义
        printf("0.");
        for (int j = 0; j < expAbs - 1; j++){
            printf("0");
        }
        for (int i = 0; i < lenA; i++){
            printf("%c", A[i]);
        }
    }

完整代码

/*
 * app=PAT-Basic lang=c++
 * https://pintia.cn/problem-sets/994805260223102976/problems/994805297229447168
 */
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 10010;
char A[maxn] = {};//实数部分
char E[5] = {};//指数部分
int main()
{
    char signA, signE,tmp;        //signA:实数符号,signE:指数符号;
    int lenA = 0,lenE;
    int expAbs = 0;                //expAbs:指数绝对值
    scanf("%c",&signA);
    while (1){
        scanf("%c", &tmp);
        if (tmp == 'E'){
            break;
        }
        else if (tmp == '.'){
            continue;
        }
        else{
            A[lenA++] = tmp;
        }
    }
    scanf("%c",&signE);
    scanf("%s",&E);
    lenE = strlen(E);
    for (int i = 0; i < lenE; i++){
        expAbs *= 10;
        expAbs += (E[i] - '0');
    }
    if (signA == '-'){
        printf("-");
    }
    if (signE == '+'){//指数为正数
        if (expAbs < lenA - 1){//指数小于实数长度,则需要小数点,且位于expAbs + 1处
            for (int i = 0; i < lenA; i++){
                if (i == expAbs + 1){
                    printf(".");
                }
                printf("%c", A[i]);
            }
        }
        else{//不需要小数点,但是可能需要要添0
            for (int i = 0; i < lenA; i++){
                printf("%c", A[i]);
            }
            for (int j = 0; j < expAbs - lenA + 1; j++){
                printf("0");
            }
        }
    }
    else{//指数为负数,不考虑 -0 情况,因为没意义
        printf("0.");
        for (int j = 0; j < expAbs - 1; j++){
            printf("0");
        }
        for (int i = 0; i < lenA; i++){
            printf("%c", A[i]);
        }
    }
    return 0;
}
编辑于 2019-12-03 14:20:25 回复(0)
#include<stdio.h>
#include<string.h>
int main (){//the shorter,the better.
    int m,f,i,Id,len;char s[9999];
    for(;~scanf("%s",s);){
        for (len=strlen(s),f=m=Id=0,i=3;i<len;s[i]=='E'?(s[i++]='\0',f=1):f?(m=m*10+s[i]%48):(++Id),i++);
        s[0]=='+'?:printf("-");
        if(s[4+Id]=='+'){
            printf("%c",s[1]);
            if(Id>=m)for (--m,i=3;s[i];printf(m?"%c":"%c.",s[i]),--m,i++);
            else{
                for (i=3;s[i];--m,printf("%c",s[i]),i++);for(;m>0;printf("0"),--m);
            }
        }else{
            for (printf("0."),i=1;i<m;printf("0"),i++);for (printf("%c",s[1]),i=3;s[i];printf("%c",s[i]),i++);
        }
    }
}
发表于 2018-01-30 20:23:19 回复(0)
简洁.易懂 欢迎参考
#include<iostream>
#include<stdlib.h>
#include<string>
using namespace std;

int main()
{
string N;
cin>>N;
int e;//E的位置
if(N[0]=='-')
{
    cout<<"-";
}
for(int i=0;i<N.length();i++)
{
    if(N[i]=='E')
    {
      e=i;
    }
}
int num=0;
for(int j=e+2;j<N.length();j++)
 {
  num= (N[j]-'0')+(10*num);
 }
//输出不加位数的数字
N[2]=N[1];
if(N[e+1]=='-')
{
    cout<<"0.";
for(int i=1;i<num;i++)
{
    cout<<"0";
}
for(int j=2;j<e;j++)
{
cout<<N[j];
}
}else{
for(int j=2;j<e;j++)
{
cout<<N[j];
}
int z=e-3;//小数点后几位
//cout<<z<<endl;
for(int i=0;i<num-z;i++)
{
    cout<<"0";
}

}
system("pause");
return 0;

}
发表于 2017-12-01 15:03:52 回复(0)
import java.util.Scanner;
public class Main {
	public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String num = in.next();
        int ei = num.indexOf('E');
        String right = num.substring(3,ei);
        int offset = Integer.parseInt(num.substring(ei+2));
        boolean flag = num.charAt(ei+1)=='+'?true:false;
        if(num.charAt(0)=='-')
        	System.out.print("-");
        if(flag){
            System.out.print(num.charAt(1));
            for(int i = 0;i<offset;i++){
                if(i>=right.length())
                    System.out.print("0");
                else
                    System.out.print(right.charAt(i));
            }
            if(offset<right.length()){
                System.out.print(".");
                for(int i = offset;i<right.length();i++){
                    System.out.print(right.charAt(i));
                }
            }
        }else{
            System.out.print("0.");
            for(int i = 1;i<offset;i++)
                System.out.print("0");
            System.out.print(num.charAt(1));
            System.out.print(right);
        }
    }
}

发表于 2016-06-13 13:31:26 回复(0)
#include <stdio.h>
#include <ctype.h>
int main(){
 int c;
 char flag;
 flag=getchar();
 if(flag=='-')
 printf("-");
 char s1[10000];int i=0;
 s1[i]=getchar();
 c=getchar();
 i++;
 while((c=getchar())!='E'){
  s1[i]=c;
  i++;
 }
 flag=getchar();
 int s2[1];
 scanf("%d",&s2[0]);int j=0;
 if(flag=='+'){
  s2[0]+=1;
  while(s2[0]!=0){
   if(isdigit(s1[j])){
   printf("%c",s1[j]);j++;
   --s2[0];
  }
   else{
   printf("0");
   --s2[0];
  }
  }
  if(j<i)
  printf(".");
  for(;j<i;j++){
   printf("0");
  }
  
 }else if(flag=='-'){
  s2[0]-=1;
  printf("0.");
  while(s2[0]!=0){
   printf("0");
   --s2[0];
  }
  for(;j<i;j++){
   printf("%c",s1[j]);
  }
 }
 return 0;
}

编辑于 2018-02-11 01:06:25 回复(2)
c语言思路清晰,代码略长
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char arr[10005],s[2];
int a[10005],b[10005],c[10005];  //分别存储整数部分,小数部分,指数部分

int main(){
  scanf("%s",arr);
  int len = strlen(arr);
  int i,flag = 0,k = 0,m = 0,n = 0;
  s[0] = arr[0];
  for(i = 1; i < len; i++){
    if(arr[i] >= '0' && arr[i] <= '9' && flag == 0){
        a[k++] = arr[i] - '0';
    }
    if(arr[i] == '.' && flag == 0)   flag = 1;
    if(arr[i] >= '0' && arr[i] <= '9' && flag == 1){
        b[m++] = arr[i] - '0';
    }
    if(arr[i] == 'E' && flag == 1){
       s[1] = arr[i+1];  i++ ; flag = 2;
    }
    if(arr[i] >= '0' && arr[i] <= '9' && flag == 2){
        c[n++] = arr[i] - '0';
    }
  }

  int t = 1,sum = 0;
  for(i = n-1; i >= 0; i--){
    sum += c[i]*t;
    t *= 10;
  }
  if(s[0] == '-') printf("-");
  if(s[1] == '-'){
    if(sum >= k){
        printf("0.");
        for(i = sum-k; i >= 1; i--)
            printf("0");
        for(i = 0; i < k; i++)
            printf("%d",a[i]);
        for(i = 0; i< m; i++)
            printf("%d",b[i]);
    }else {
      for(i = 0; i < k; i++){
        if(i == sum)
            printf(".%d",a[i]);
        else
          printf("%d",a[i]);
      }
      for(i = 0; i< m; i++)
            printf("%d",b[i]);
    }
  }else{
    if(sum >= m){
        for(i = 0; i < k; i++)
            printf("%d",a[i]);
        for(i = 0; i< m; i++)
            printf("%d",b[i]);
        for(i = sum - m ; i >= 1; i--)
                printf("0");
    }else{
        for(i = 0; i < k; i++)
            printf("%d",a[i]);
         for(i = 0; i < m; i++){
            if(i == sum)
               printf(".%d",b[i]);
            else
               printf("%d",b[i]);
         }
    }
  }
 return 0;
}

发表于 2020-11-16 11:23:37 回复(0)
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
 
int main()
{
    char str[10000]={0};
    char *ptr;
    int exp,i;
     
 
    scanf("%s", str);
 
    if('-' == str[0])
        printf("-");
    for (i=3; i< strlen(str); i++) {
        if (str[i] == 'E') {
            //printf("%s\n",str+i+2);
            exp=atoi(str+i+1);
            str[i] = '\0';
            str[2] = str[1];
            ptr = str + 2;
            break;
        }
    }
    //printf("%d\n",exp);
     
    if (exp<0) {
        printf("0.");
        for(;exp<-1;exp++) {
            printf("0");
        }
        printf("%s",ptr);
    } else {
        int ef=0;
        printf("%c",ptr[0]);
        for (i =0;i<exp;i++) {
            if( (i+1) < strlen(ptr))
                printf("%c",ptr[i+1]);
            else {
                ef=1;
                printf("0");
            }
        }
        if (!ef && exp+1 < strlen(ptr)) {
            printf(".%s",str+exp+1);
        }
    }
    printf("\n");
}

发表于 2020-05-22 11:23:02 回复(2)

水题(找规律就完事)不得不说,stl真香(逃...
#include <bits/stdc++.h>
using namespace std;
int main(){
	string s;
	while(cin>>s){
		bool ***,zhifu;
		int dotpos,Epos,zhi;
		string zheng;
		if(s[0]=='+') ***=1;
		else ***=0;
		Epos=s.find('E');
		if(s[Epos+1]=='+') zhifu=1;
		else zhifu=0;
		zhi= stoi(s.substr(Epos+2));
		zheng=s.substr(1,Epos-1);
		if(zhifu){
			if(zhi<zheng.size()-2){
				for(int i=1;i<=zhi;++i){
					char tmp=zheng[i];
					zheng[i]=zheng[i+1];
					zheng[i+1]=tmp;
				}
			}
			else {
				zheng.erase(zheng.begin()+1);
				int x=zhi-zheng.size()+1;
				while(x--){
					zheng+='0';
				}
			}
		}
		else {
			while(zhi--){
					char tmp=zheng[0];
					zheng[0]=zheng[1];
					zheng[1]=tmp;
					zheng='0'+zheng; 
			}
		}
		if(!***)
		cout<<'-'<<zheng<<endl;
		else cout<<zheng<<endl;
	}
	return 0;
}

发表于 2020-04-26 17:00:03 回复(1)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {

	private static BufferedReader bufferedReader;

	public static void main(String[] args) throws IOException {
		bufferedReader = new BufferedReader(new InputStreamReader(System.in));
		
		String string = bufferedReader.readLine();
		
		char sign1 = string.charAt(0);
		
		StringBuilder result = new StringBuilder();
		
		StringBuilder first = new StringBuilder(string.substring(1, string.indexOf('E')));
		String second = string.substring(string.indexOf('E') + 1);
		
		char sign2 = second.charAt(0);
		
		int num = Math.abs(Integer.parseInt(second));
//		左移
		if (sign2 == '-') {
			for (int i = 0; i < num; i++) {
				result.append('0');
			}
			first.deleteCharAt(1);
			result.append(first);
			
			result.insert(1, '.');
			
		} else if (sign2 == '+') { // 右移
			result.append(first);
			
			if (num >= first.length() - 2) {
				result.deleteCharAt(1);
				for (int i = 0; i < num - first.length() + 2; i++) {
					result.append('0');
				}
			} else {
				result.deleteCharAt(1); // 测试通过
				result.insert(num + 1, '.');
			}
		}
		
		if (sign1 == '-') {
			result = new StringBuilder("-").append(result);
		}
		System.out.println(result);
	}
}
不难,但是烦人的一道题。
发表于 2020-03-01 14:44:00 回复(1)
#include<iostream>
#include<string>
#include<cmath>
usingnamespacestd;
 
intmain()
{
    string str;
    cin >> str;
    intt_e = 0;
    for(inti = 0;i < str.size();i++)
    {
        if(str[i] == 'E')
        {
            t_e = i;
            break;
        }
 
    }
    string str_num, str_mi;
    string result;
    str_num = str.substr(1, t_e - 1);
    str_mi = str.substr(t_e + 2, str.length() - t_e - 2);
    intlen = stoi(str_mi);
     
    if(str[0] == '-')
        result = "-"+ result;
    if(len == 0)
    {
        //result += str_num;
        result += str_num;
        cout << result << endl;
    }
    else{
        if(str[t_e + 1] == '+')
        {
            inti = str.find(".", 0);
            //int f_num = i - 1;
            inta_num = t_e - i - 1;
 
 
            str_num.erase(i - 1, 1);
            str_num.insert(str_num.length(), len-a_num, '0');
            //if(len==0)
            //str_num.insert(i + len, 1, '.');
             
        }
        else
        {
            inti = str.find(".", 0);
            //int f_num = i - 1;
            //int a_num = t_e - i - 1;
            str_num.erase(i - 1, 1);
            str_num.insert(0, len, '0');
            str_num.insert(1, 1, '.');
             
        }
        result += str_num;
        cout << result << endl;
    }
     
     
    //system("pause");
    return0;
}

发表于 2019-01-17 14:42:16 回复(0)
#include<iostream>
#include<string>
using namespace std; 
int main()
{     //+1.23400E-03     string num,ans;     char symbol;     int pointPlace,ePlace,eSymbol,eIndex,intLen;      // 处理输入数据      cin >> num;     symbol = num[0]; // 正负     pointPlace = num.find('.'); //小数点的位置      ePlace = num.find('E'); // E的位置      ans = num.substr(1,pointPlace - 1) + num.substr(pointPlace + 1, ePlace - 3); // 底数部分数字     eSymbol = num[ePlace + 1]; // e的指数部分 符号      eIndex = stoi(num.substr(ePlace + 2, num.size() - 1)); // e的指数部分 数字          if(eSymbol == '+')intLen = pointPlace - 1 + eIndex;     else intLen = pointPlace - 1 - eIndex; // 整数部分位数          // 输出     if(symbol == '-')cout << "-";      if(intLen <= 0 ) // 0.xxxx型     {         cout << "0.";         for(int i =0; i < -intLen; i++)cout << "0";         cout << ans << endl;     }     else if(intLen >= ans.size()) //xxxxx00型     {         ans.append(intLen - ans.size(), '0');         cout << ans << endl;     }     else //xxx.xx型     {         cout << ans.substr(0,intLen) << "." << ans.substr(intLen,ans.size()-1);     }     return 0;
}

编辑于 2018-10-25 19:30:25 回复(0)

python语言

try:
    while True:
        string = input()
        left,right = string.split('E')  #left代表数值部分
        pointIndex = 1                #记录之前小数点位置
        left = left[1:].replace(".","")   #把小数点去掉
        right = int(right)            #右边指数部分
        if right > 0:
            if right+pointIndex >= len(left):    #指数+小数点位置超过数值长度就是在数值后面+0
                result = left+"0"*(right+pointIndex-len(left))
            else:       #否则在数值中间找到对的位置插入点
                result = left[:right+pointIndex] + "." + left[right+pointIndex:]
        else:
            if right<0:    #左移确保指数不为零,第一位移动很重要,剩余位都是插零了
                result = "0."+'0'*(-pointIndex-right)+left
            else:
                result = left
        if string[0] == '-':
            print('-'+result)
        else:
            print(result)

except Exception:
    pass
编辑于 2018-09-21 16:56:26 回复(1)
// 思路: 分类讨论,移动小数点即可
#include <iostream>
#include <string>
#include <math.h>
#include <sstream>
using namespace std;

int string2int(string a)
{
    stringstream ss;
    ss<<a;
    int out ;
    ss>>out;
    return out;
}

int main()
{
    string a;
    cin >> a;
    char symbol = a[0];
    string integer = a.substr(1, a.find('.')-1);
    string _float = a.substr(a.find('.')+1, a.find('E') - a.find('.')-1);
    string power = a.substr(a.find('E')+1, a.size() - a.find('E'));
    //cout << integer << " " << _float << " " << power << endl;
    int pow = string2int(power);
    if(symbol == '-')
    {
        cout << "-";
    }
    if(pow >= 0)
    {
        cout << integer;
        int i = 0;
        if(pow >= _float.size())
        {
            cout << _float;
            for(int j=pow-_float.size(); j>0; j--)
            {
                cout << "0";
            }
        }
        else
        {
            for(i=0; i<pow; i++)
            {
                cout << _float[i];
            }
            cout << ".";
            for(; i<_float.size(); i++)
            {
                cout << _float[i];
            }
        }
    }
    else
    {
        int i = 0;
        cout << "0.";
        for(i=pow; i<-1; i++)
        {
            cout << "0";
        }
        cout << integer;
        cout << _float;
    }
}

发表于 2018-06-23 20:26:04 回复(0)