【2024.9.29练习】R 格式

题目描述


题目分析

带小数点的高精度乘法。小数点在计算时忽略,只需在最终打印字符串的时候在合适位置四舍五入即可。对于,可理解为对d乘2总共n次。因此使用"单精度×高精度"类型的算法足矣。


我的代码

一开始代码有错误,我只想到了对小数点前最后一位四舍五入,却没想到末位进一之后可能会满10,然后要再向前一位借1。后面又写了一个进位函数解决了问题。

并且一开始的最大数组长度写小了,考虑到还有的系数,应该再增加300位。测试用例果真说明如此。看来以后数组长度能开大还是尽量大一些。

cpp 复制代码
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
const int LEN = 2030; //数组最大长度
//预处理
void clear(int a[]) {
	for (int i = 0; i < LEN; ++i) a[i] = 0;
}
//是否有浮点
int p = 0; //默认的小数点在第几位之前
bool check_point(string s) {
    int len = s.length();
    for (int i = 0; i < len; i++) {
        if (s[i] == '.') {
            p = len - i - 1;
            return true;
        }
    }
    return false;
}
//读取字符串并转换为高精度数组
void read(int a[]) {
    string s;
    cin >> s;
	clear(a);
	int len = s.length();
    if (check_point(s)) {
        int j = 0;
        for (int i = 0; i < len; i++) {
            if (s[i] == '.') {
                j--;
            }
            else {
                a[len - j - 2] = s[i] - '0';
            }
            j++;
        }
    }
    else {
        for (int i = 0; i < len; i++) a[len - i - 1] = s[i] - '0';
    }
}
//高精度×单精度
void mul_short(int a[], int b, int c[]) {
    clear(c);

    for (int i = 0; i < LEN - 1; ++i) {
        c[i] += a[i] * b;
        if (c[i] >= 10) {
            c[i + 1] += c[i] / 10;
            c[i] %= 10;
        }
    }
}
//数组复制
void copyy(int a[],int b[]) { //a to b
    clear(b);
    for (int i = 0; i < LEN; i++) {
        b[i] = a[i];
    }
}
void print(int a[]) {
    int i;
    for (i = LEN - 1; i >= p+1; i--)
        if (a[i] != 0) break;
    for (; i >= p; --i) cout << a[i];
}
void print2(int a[]) {
    int i;
    for (i = LEN - 1; i >= 1; --i)
        if (a[i] != 0) break;
    for (; i >= 0; --i) putchar(a[i] + '0');
    putchar('\n');
}
void addone(int a[],int p) {
    a[p]++;
    if (a[p] >= 10) {
        a[p] %= 10;
        addone(a,p+1);
    }
}
int d[LEN];
int ans[LEN];
int main() {
    int n;
    cin >> n;
    read(d);
    //乘2共n次
    for (int i = 0; i < n; i++)
    {
        mul_short(d, 2, ans);
        copyy(ans, d);
    }
    //print2(ans);
    if (ans[p - 1] > 4) {
        addone(ans,p);
    }
    print(ans);
	return 0;
}

这道题不仅函数不完全是我自己写的(因为记不住),而且编写和纠错过程也十分漫长,常常被自己绕晕。高精度运算函数默写难度还是很大的,目前自己各方面的水平都还完全不行,要熟练掌握算法还需多加训练和思考!!

相关推荐
梵刹古音2 分钟前
【C语言】 指针基础与定义
c语言·开发语言·算法
啊阿狸不会拉杆19 分钟前
《机器学习导论》第 5 章-多元方法
人工智能·python·算法·机器学习·numpy·matplotlib·多元方法
R1nG8631 小时前
CANN资源泄漏检测工具源码深度解读 实战设备内存泄漏排查
数据库·算法·cann
_OP_CHEN1 小时前
【算法基础篇】(五十六)容斥原理指南:从集合计数到算法实战,解决组合数学的 “重叠难题”!
算法·蓝桥杯·c/c++·组合数学·容斥原理·算法竞赛·acm/icpc
TracyCoder1231 小时前
LeetCode Hot100(27/100)——94. 二叉树的中序遍历
算法·leetcode
九.九2 小时前
CANN HCOMM 底层机制深度解析:集合通信算法实现、RoCE 网络协议栈优化与多级同步原语
网络·网络协议·算法
C++ 老炮儿的技术栈2 小时前
Qt Creator中不写代如何设置 QLabel的颜色
c语言·开发语言·c++·qt·算法
子春一2 小时前
Flutter for OpenHarmony:构建一个 Flutter 数字消消乐游戏,深入解析网格状态管理、合并算法与重力系统
算法·flutter·游戏
草履虫建模8 小时前
力扣算法 1768. 交替合并字符串
java·开发语言·算法·leetcode·职场和发展·idea·基础
naruto_lnq10 小时前
分布式系统安全通信
开发语言·c++·算法