科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式 [±][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
思路
- 读取时用到格式化字符串%[ ^… ],读取终于[ ]字符。
- 输出时候考虑两种大情况,指数小于0和指数大于0
- 指数小于0 时,先输出“0.”,再输出0,再输出数字
- 指数大于0时,输出数字的时候要考虑,指数比小数部分小,就需输出小数点
参考代码
→https://blog.csdn.net/weixin_39345384/article/details/82260550
→https://blog.csdn.net/Oliver__Lew/article/details/72512586
代码
#include <stdio.h>
#include <string.h>
#include <math.h>
int main(void)
{
char shuru[10005];
int i, j, k = 0, p = 0, m = 0, zhishu;
scanf("%[^E]E%d", shuru, &zhishu);
if (shuru[0] == '-')
{
printf("-");
}
if (zhishu < 0)
{
printf("0.");
for (i = 0; i < abs(zhishu) - 1; i++)
{
printf("0");
}
for (i = 1; shuru[i] != '\0'; i++)
{
if (i != 2)
{
printf("%c", shuru[i]);
}
}
}
else
{
for (i = 1; shuru[i] != '\0'; i++)
{
if (i != 2)
{
printf("%c", shuru[i]);
}
if (zhishu == i - 2 && i != strlen(shuru) - 1)
{
printf(".");
}
}
if (zhishu > strlen(shuru) - 3)
{
for (i = 0; i < abs(zhishu) - 1; i++)
{
printf("0");
}
}
}
return 0;
}
C++
思路
代码参考柳神
1、定义字符串s,首先要找到E的位置。
2、将数字与指数部分分开,数字用string存储【s.substr(1, i-1),从1开始避开符号,i-1是数字部分的最后一个数】,指数部分用stoi()函数变为int型【s.substr(i+1),也要将指数部分的符号存入】
3、根据s[0]判断整体是负数还是正数,负数则输出负号
4、判断指数部分是否大于0,再分开讨论
5、分开讨论的时候n>0的情况更复杂
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
string s;
cin >> s;
int i = 0;
while(s[i] != 'E') i++; //找到E的位置
string t = s.substr(1, i - 1);
int n = stoi(s.substr(i+1));
if(s[0] == '-') cout << "-";
if(n < 0)
{
cout << "0.";
for(int i = 0; i < abs(n) - 1; i++)
{
cout << "0";
}
for(int i = 0; i < t.length(); i++)
{
if(t[i] != '.') cout << t[i];
}
}
else
{
cout << t[0];
int j, cnt;
for(j = 2, cnt = 0; j < t.length() && cnt < n; j++, cnt++)
{
cout << t[j];
}
if(j == t.length())
{
for(int k = 0; k < n - cnt; k++) cout << "0";
}
else
{
cout << ".";
}
for(int k = j; k < t.length(); k++)
{
cout << t[k];
}
}
return 0;
}