EOJ 2995. 科学计数法 个人解题记录
作者:互联网
2995. 科学计数法
题干
任给一个十进制正数 M>0 (M 可能为整数或小数,且最多包含 200 位数字)。写一个程序将其转换成科学计数法表示,形式为 aFb。其中 1≤a<10 且不含前置 0,a 的长度为给定精度 p (p 包括 a 中整数及小数部分但不包含小数点)。a 的值由四舍五入方法确定,M 中有效数字长度小于 p 时,后面填充 0 补足。b 为指数,b=0 时,省略指数部分。
输入格式
第 1 行:一个整数 T(1≤T≤10)为问题数。
每组测试数据为一行,包含两个数字,之间由一个空格分开。第一个数字是待转换数字 M,第二个数字是要求的输出精度 p (1<p≤30)。
输出格式
对于每个问题,输出一行问题的编号(0 开始编号,格式:case #0: 等)。
然后接下来一行中输出给定数字的科学计数法表示。
样例
input
3
123456789 8
0.0045678 3
1.8 4
output
case #0:
1.2345679F8
case #1:
4.57F-3
case #2:
1.800
繁琐的代码
#include <iostream>
#include <string>
#include <string.h>
using namespace std;
int main()
{
int ti, ret = 0;
cin >> ti;
while (ti--)
{
printf("case #%d:\n", ret++);
string a, b;
int f, num;
cin >> a >> num;
if (a[0] == '-')
{
a.erase(a.begin());
cout << "-";//符号判断
}
if (a.find('.') == -1)
{
a = a + '.';
}
a = '0' + a; //奇怪的步骤,但可以防止999变2位精度时不能得到1.0F3,留空给进位用
int head = a.find('.'); //原本的小数点位在head-1处
int temphead = head;
string::iterator it = a.begin();
while (temphead--)
{
it++;
}
a.erase(it); //除去小数点;
a = a + "00000000000000000000000000000000000000000000000000000000000000000000000000000";
int prezero = 0;
for (int i = 0; a[i] != '\0'; i++)
{
if (a[i] == '0')
{
prezero++;
continue;
}
break;
}
// cout << "test data::prezero ->" << prezero << endl; //实际上都多了1位
int res = 1;
// cout << "The number we determine add---" << a[prezero + num] << endl;//判断是否该进位
// cout << "first:" << a << endl;
if (a[prezero + num] >= '5')
for (int i = prezero + num - 1; i >= prezero - 1; i--)
{
if (a[i] == '9' & res == 1)
{
a[i] = '0';
res = 1;
continue;
}
a[i] = a[i] + res;
res = 0;
} //精确度操作
// cout << "lasto:" << a;//测试精度转换成功否?
int prezero2 = 0; //重新统计0
for (int i = 0; a[i] != '\0'; i++)
{
if (a[i] == '0')
{
prezero2++;
continue;
}
break;
}
int tail = head - prezero2 - 1;//尾数
// cout<<tail<<endl;
for (int i = prezero2; i < prezero2 + num; i++)
{
cout << a[i];
if (i == prezero2)
cout << ".";
}
if (tail != 0)
cout << "F" << tail;//为零就不输出
cout<<endl;
}
}
//我的博客主页在https://www.cnblogs.com/emokable/
//思路:对真分数和假分数一起判断,前置0用于进位,用string容器的find()找出'.'的位置
//用了两次前置0,第一次用来定位判断进位,第二次则是找到输出位置(因为进位后前置0变化)
标签:case,数字,int,EOJ,2995,计数法,res,include 来源: https://www.cnblogs.com/emokable/p/16139873.html