其他分享
首页 > 其他分享> > EOJ 2995. 科学计数法 个人解题记录

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变化)
> ps:自己做了这道题,理清思路就不难了

标签:case,数字,int,EOJ,2995,计数法,res,include
来源: https://www.cnblogs.com/emokable/p/16139873.html