开一个做网站的工作室,cn域名的网站,抖音短剧推广平台有哪些,wordpress菜单移到右边文章目录 R 格式【问题描述】解题思路高精度乘法高精度加法 R 格式
【问题描述】
小蓝最近在研究一种浮点数的表示方法#xff1a;R 格式。对于一个大于 0 的浮点数 d#xff0c;可以用 R 格式的整数来表示。给定一个转换参数 n#xff0c;将浮点数转换为 R格式整数的做法… 文章目录 R 格式【问题描述】解题思路高精度乘法高精度加法 R 格式
【问题描述】
小蓝最近在研究一种浮点数的表示方法R 格式。对于一个大于 0 的浮点数 d可以用 R 格式的整数来表示。给定一个转换参数 n将浮点数转换为 R格式整数的做法是
将浮点数乘以 2n;四舍五入到最接近的整数。
【输入格式】 一行输入一个整数 n 和一个浮点数 d分别表示转换参数和待转换的浮点数。 【输出格式】 输出一行表示答案d 用 R 格式表示出来的值。 【样例输入】
2 3.14【样例输出】
13【样例说明】 3.14 × 22 12.56四舍五入后为 13。
【评测用例规模与约定】 对于 50% 的评测用例1 ≤ n ≤ 101 ≤ 将 d 视为字符串时的长度 ≤ 15。 对于 100% 的评测用例1 ≤ n ≤ 10001 ≤ 将 d 视为字符串时的长度≤ 1024保证 d 是小数即包含小数点。
解题思路
题意分析
将浮点数乘以 2n;四舍五入到最接近的整数。
根据题意将d * 2n分解为d * 2 * 2 * 2 * 2 * 2……这里2的n次方不能使用pow函数当n过大会得不到答案因为d长度小于等于1024所以可以使用高精度乘法的算法来实现
然后该如何去乘这里我先给出结论 一个小数乘以一个大于0的整数时小数点位数本身不会改变但小数点后面的数字可能会发生变化。乘法操作并不改变数字中小数点的位置它只是会影响小数点前后的数字值。 所以我们先将小数看作一个整数相乘即可例如1.05 * 2105 * 22102.10
四舍五入最后看小数点第一位是否大于等于5如果大于等于5前一位需要1需要注意的是这里可能存在连续进位例如9999.5应该四舍五入为10000所以这里因该使用高精度加法的算法
高精度乘法高精度加法
#includebits/stdc.h
using namespace std;// 乘法函数用于将向量 a 中的每个元素乘以整数 n并返回结果向量
vectorint mul(vectorint a,int n)
{vectorint c; // 结果向量int t0; // 用于累计进位for(int i0;ia.size()||t;i){if(ia.size()) ta[i]*n; // 计算当前位与 n 的乘积加上之前的进位c.push_back(t%10); // 将乘积的个位数加入结果向量t/10; // 更新进位}return c; // 返回结果向量
} // 加法函数用于将向量 b 的每个元素与整数 n 相加并返回结果向量
vectorint sum(vectorint b,int n)
{vectorint c; // 结果向量int t0; // 用于累计进位for(int i0;ib.size();i){tb[i]; // 加上当前位的值if(n) tn%10; // 如果 n 不为零则加上 n 的当前位c.push_back(t%10); // 将和的个位数加入结果向量t/10; // 更新进位n/10; // 更新 n移动到下一位}if(t) c.push_back(t); // 如果最后还有进位加到结果向量的末尾return c; // 返回结果向量
}int main()
{int n; // 转换参数 nstring s; // 待转换的浮点数 d 作为字符串cinns; // 从输入读取 n 和 sstring t; // 用于存储去掉小数点后的数字字符串int k0; // 小数点后数字的个数// 移除小数点并计算 kfor(int i0;is.size();i){if(s[i]!.)ts[i];elseki; }kt.size()-k; // 计算小数点后的位数vectorint a; // 存储数字的向量每个元素是一位数字// 将字符串 t 的数字转换为向量 afor(int it.size()-1;i0;i--)a.push_back(t[i]-0); // 将 a 乘以 2^nfor(int i1;in;i)amul(a,2);reverse(a.begin(),a.end()); // 反转结果向量以便从最高位开始处理int pa[a.size()-k]; // 获取可能需要四舍五入的位if(p5) // 如果需要四舍五入{vectorint b;// 构造需要增加 1 的向量 bfor(int ia.size()-1-k;i0;i--){b.push_back(a[i]);}bsum(b,1); // 对 b 加 1for(int ib.size()-1;i0;i--)coutb[i]; // 输出结果}else // 如果不需要四舍五入{for(int i0;ia.size()-k;i)couta[i]; // 直接输出结果}return 0;
}代码大致流程
读取输入的转换参数 n 和浮点数 s。去除 s 中的小数点并计算出小数点后的位数 k。将处理过的数字转换为一个由单个数字组成的向量 a并对其进行 n 次乘以 2 的操作。判断是否需要进行四舍五入根据判断结果输出最终的整数值。
此代码通过数位分离和模拟手算乘法、加法的方式精确地处理了大数问题确保了在面对极大的 n 时仍能正确计算并避免浮点数精度问题。