科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式[+-][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; }