摧锋 2024-03-24 14:55 采纳率: 0%
浏览 15

蓝桥杯—高精度求平方差


#include <bits/stdc++.h>
using namespace std;
//大数减法
bool cmp(vector<int> a, vector<int> b)  //比较ab大小,模拟前置负号
{
    if (a.size() != b.size()) return a.size() > b.size();
    else
    {
        for (int i = a.size() - 1; i >= 0; i--)
        {
            if (a[i] != b[i]) return a[i] > b[i];
        }
    }
    return true;
}
//大数减法
vector<int> sub(vector<int> a, vector<int> b)
{
    int t = 0;
    vector<int> c;
    for (int i = 0; i < a.size(); i++)
    {
        t = a[i] - t;
        if (i < b.size()) t -= b[i];
        if (t >= 0)
        {
            c.push_back(t);
            t = 0;
        }
        else
        {
            c.push_back(t + 10);
            t = 1;
        }
    }
    while (c.size() > 1 && c.back() == 0) c.pop_back();  //去掉前导0;例如775-772=003
    return c;
}

vector<int> mul_p(vector<int> a, vector<int> b) {
    vector<int> c(a.size() + b.size(), 0); // 初始化c为全0
    int lc = 0;
    for (int i = 0; i < a.size(); i++) {
        for (int j = 0; j < b.size(); j++) {
            int idx = i + j;
            int carry = a[i] * b[j]; // 计算当前位的乘积
            while (idx <= lc) {
                carry += c[idx]; // 加上当前位置上的值
                c[idx] = carry % 10; // 将个位数存入c
                carry /= 10; // 计算进位
                idx++; // 移动到下一位
            }
            while (carry > 0) {
                if (idx >= c.size()) c.push_back(0); // 如果c的长度不够,则扩展c
                c[idx] = carry % 10; // 如果进位不为0,则继续添加到c的下一位
                carry /= 10;
                idx++;
                lc++;
            }
        }
    }
    while (c.size() > 1 && c.back() == 0) c.pop_back();
    return c;
}

signed main()
{
    // 请在此输入您的代码
    string a, b;
    cin >> a; cin >> b;
    vector<int> A, B, C;
    if (a[0] == '-') for (int i = a.size() - 1; i > 0; i--) A.push_back(a[i] - '0');
    else for (int i = a.size() - 1; i >= 0; i--) A.push_back(a[i] - '0');
    if (b[0] == '-') for (int i = b.size() - 1; i > 0; i--) B.push_back(b[i] - '0');
    else for (int i = b.size() - 1; i >= 0; i--) B.push_back(b[i] - '0');
    vector<int> X = mul_p(A, A);
    vector<int> Y = mul_p(B, B);
    if (cmp(X, Y))
    {
        C = sub(X, Y);
    }
    else 
  {
        C = sub(Y, X);
        cout << "-";
    }
    for (int i = C.size() - 1; i >= 0; i--) cout << C[i];
    return 0;
}

以上是我的代码,但只通过60%的数据,鄙人百思不得其解,想请教一下大家是哪个地方出了问题

img

  • 写回答

3条回答 默认 最新

  • 码农阿豪@新空间代码工作室 Java领域优质创作者 2024-03-24 14:55
    关注
    让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
    问题描述: 给定两个整数 A 和 B,求 A^2 - B^2 的值。 输入格式: 共两行,第一行为整数 A,第二行为整数 B。A 和 B 都不超过 1e6。 输出格式: 共一行,为 A^2 - B^2 的值。如果为负数,输出负号“-”和去掉符号的绝对值。 样例输入: 5 7 样例输出: -24 解题思路: 这道题可以分为几个步骤: 将输入的字符串转化为 vector 类型,这样方便进行计算; 对于每个 vector 进行平方运算,即用 mul_p() 函数进行反复相乘,得到平方的结果; 对于每个 vector 进行差运算,即用 sub() 函数进行大数减法,得到平方之差的结果; 判断结果是否为负数,如果是负数,输出负号并输出去掉符号的绝对值。 需要注意一下两个小细节: 首先是输入的字符串可能带有符号,需要根据第一个字符来判断是否有符号,如果有符号,则需要从第二个字符开始读入数字; 其次是结果可能不是绝对值最小的,需要判断大小关系来选取正确的符号。 代码实现及注释如下:
    评论

报告相同问题?

问题事件

  • 创建了问题 3月24日

悬赏问题

  • ¥15 悬赏Python-playwright部署在centos7上
  • ¥15 psoc creator软件有没有人能远程安装啊
  • ¥15 快速扫描算法求解Eikonal方程咨询
  • ¥20 我的是道格手机,重置后屏幕右上角出现红色字的未写入tee key 和未写入google key请问怎么去掉啊
  • ¥30 关于R语言运行分区生存模型中的问题!
  • ¥15 校内二手商品转让网站
  • ¥20 高德地图聚合图层MarkerCluster聚合多个点,但是ClusterData只有其中部分数据,原因应该是有经纬度重合的地方点,现在我想让ClusterData显示所有点的信息,如何实现?
  • ¥100 求Web版SPC控制图程序包调式
  • ¥20 指导如何跑通以下两个Github代码
  • ¥15 大家知道这个后备文件怎么删吗,为啥这些文件我只看到一份,没有后备呀