科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式[+-][1-9]"."[0-9]+E[+-][0-9]+,即数字的整数部分
只有1位,小数部分至少有1位,该数字及其指数部分的正负号即使对正数也必定明确给出。
现以科学计数法的格式给出实数A,请编写程序按普通数字表示法输出A,并保证所有有效位都被保留。
每个输入包含1个测试用例,即一个以科学计数法表示的实数A。该数字的存储长度不超过9999字节,且其指数的绝对值不超过9999。
对每个测试用例,在一行中按普通数字表示法输出A,并保证所有有效位都被保留,包括末尾的0。
+1.23400E-03
0.00123400
#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;
}
}
}
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());
}
}
#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++);
}
}
}
#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()
正则表达式[+-][1-9].[0-9]+E[+-][0-9]+给出本题关键。整数部分为(1-9)限制了0的情况。
不论是什么样的字符串读取逻辑,其目的都是需要固定的几个数组或数字:
实数符号,存为char,为+号不输出,-号应输出。
实数部分,存入char数组,可以不需要含小数点,因为科学计数法固定为第一位后为小数点。
指数正负号,存为char,用于后面移位的判断。
指数部分,存为int,后面可直接作为判断边界。
分上述四部分读取并存入相应类型中。
不考虑指数为
0(包含+0和-0)情况,因为无意义。
指数为正数时,进位后仍需要小数点,说明指数小于(实数位数-1)(小数点在第一位后,所以要减一),并将小数点放置实数char数组中指数+1位置。
指数为正数时,进位后不需要小数点,说明指数大于等于(实数位数-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");
}
}
} 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;
}
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);
}
}
}
#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;
}
#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");
} #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;
}
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);
}
} #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;}
#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;
}
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
// 思路: 分类讨论,移动小数点即可
#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;
}
}
#include<iostream>
#include<string.h>
using namespace std;
int main(){
char number[10010];
int numE=0,cot=0;
int num=0;
cin>>number;
int len=strlen(number);
for(int i=0;i<len;++i){
if(number[i]=='E'){
numE=i;
break;
}
else if(number[i]=='.')
cot=i-1;
}
if(number[0]=='-')
cout<<number[0];
if(number[numE+1]=='-'){ //E<0
for(int i=len-1,j=1;i>numE+1;--i,j*=10){
num+=(number[i]-'0')*j;
}
if(num-cot>=0){
cout<<"0.";
for(int z=0;z<(num-cot);++z)
cout<<"0";
for(int z=1;z<numE;++z){
if(z==cot+1)
continue;
else
cout<<number[z];
}
}
else{
for(int z=1;z<numE;++z)
cout<<number[z];
}
}
else{ //E>=0
for(int i=len-1,j=1;i>numE+1;--i,j*=10){
num+=(number[i]-'0')*j;
}
if(num+cot<numE){
for(int i=1;i<numE;++i){
if(i==cot+1)
continue;
cout<<number[i];
if(i==num+cot)
cout<<".";
}
}
else{
for(int i=1;i<numE;++i){
if(i==cot+1)
continue;
cout<<number[i];
}
for(int i=numE-1;i<num+cot+1;++i)
cout<<"0";
}
}
cout<<endl;
return 0;
}