• 小Z的拼数游戏c++(求 解)


    关注 码龄 粉丝数 原力等级 -- 被采纳 被点赞 采纳率 a55553457646 2024-06-28 21:03 采纳率: 7.7% 浏览 2 首页/ 编程语言 / 小Z的拼数游戏c++(求 解) c++ c++小Z最近在玩一个有意思的游戏,他手上有两个很大的数 a 和 b。对于 a,他会把它翻转过来得到一个数 a′,然后把 a′ 拼接在 a 的后面得到一个新的数 A,例如对于 123 这个数来说,翻转过来是 321,拼起来之后就是 123321;对于 100 这个数,翻转过来是 001,拼起来之后就是 100001。对于 b,他也会进行同样的操作,得到新的数 B。然后,他会求出 A×B 的结果,请你帮他完成这个过程。 输入格式共两行。 第一行,一个很大的正整数 a。 第二行,一个很大的正整数 b。 输出格式仅一行,一个正整数,表示最后的结果。 样例输入12676样例输出826221396数据范围记 n 为 a 的位数,m 为 b 的位数。 对于 100% 的数据,保证 1≤n,m≤100,a≠0,b≠0。 收起 写回答 好问题 0 提建议 追加酬金 关注问题 微信扫一扫 点击复制链接 分享 邀请回答 编辑 收藏 删除 结题 收藏 举报 追加酬金 (90%的用户在追加酬金后获得了解决方案) 当前问题酬金 ¥ 0 (可追加 ¥500) ¥ 15¥ 20¥ 50¥ 100¥ 200 支付方式 扫码支付 二维码出错 点击刷新 支付金额 15 元 提供问题酬金的用户不参与问题酬金结算和分配 支付即为同意 《付费问题酬金结算规则》 结题 再想想 删除 再等等

    1条回答 默认 最新

    • 专家-赤兔[在线] 全栈领域优质创作者 2024-06-28 21:03
      关注

      引自免费微信小程序:皆我百晓生

      这是一个关于大数处理的问题,我们可以使用字符串来处理这些大数,避免使用内置的整型数据类型可能会导致的溢出问题。以下是一个可能的解决方案:

      首先,我们需要实现两个函数,一个用于翻转一个数(即字符串反转),另一个用于计算两个数的乘积。最后,我们需要将翻转后的数拼接回原数,并计算乘积。

      以下是具体的代码实现:

      #include 
      #include 
      #include  // for std::reverse
      
      // 函数声明
      std::string reverseString(const std::string &str); // 翻转字符串函数
      long long multiplyStrings(const std::string &num1, const std::string &num2); // 计算字符串形式的数字乘积的函数
      
      int main() {
          std::string a, b;
          std::cin >> a >> b; // 输入两个大数a和b
          std::string a_reverse = reverseString(a); // 翻转a得到a_reverse
          std::string a_new = a + a_reverse; // 将翻转后的a拼接回原数得到新的数A
          std::string b_reverse = reverseString(b); // 翻转b得到b_reverse
          std::string b_new = b + b_reverse; // 将翻转后的b拼接回原数得到新的数B
          std::cout << multiplyStrings(a_new, b_new) << std::endl; // 输出结果
          return 0;
      }
      
      // 翻转字符串函数实现
      std::string reverseString(const std::string &str) {
          std::string reversed = str; // 创建原始字符串的副本
          std::reverse(reversed.begin(), reversed.end()); // 使用STL中的reverse函数反转字符串
          return reversed;
      }
      
      // 计算字符串形式的数字乘积的函数实现(假设输入的字符串都是非负的)
      long long multiplyStrings(const std::string &num1, const std::string &num2) {
          long long result = 0; // 用于存储乘积的结果,由于乘积可能很大,因此使用long long类型以避免溢出问题。
          int len1 = num1.size(), len2 = num2.size(); // 获取两个数字的位数
          int i = len1 - 1, j = len2 - 1; // 从数字的末尾开始相乘的索引位置。这是因为字符串从前往后遍历的话,数字是递增的,所以应该从后往前遍历相乘。否则结果会出错。比如对于输入"99",从前往后遍历的结果应该是 "9*9",但是题目要求是"翻转后拼接起来再相乘",也就是需要按从后往前遍历得到 "9*9"。因此,我们需要从后往前遍历相乘。同时,我们还需要处理进位问题。假设当前位置相乘的结果大于或等于 10,则需要进位。因此我们还需要一个变量 carry 来记录进位情况。这样,我们依次计算每一位相乘的结果,并加上进位情况,然后更新进位情况。最终就可以得到结果。这样即使是大数也可以正确地计算出结果。当所有的位都计算完毕后,我们可以将结果输出。需要注意的是在输出结果时也需要从最高位开始输出,并且如果最高位为 0 则不需要输出。因此我们可以使用循环来输出每一位的结果。最后返回结果即可。需要注意的是如果输入的数字包含前导零(即数字的最高位为 0),那么在输出结果时也需要包含这些前导零。这是因为题目要求的是翻转后拼接起来再相乘的结果应该保留前导零的情况。假设输入的数字是 "001",翻转后拼接起来就是 "100",然后我们需要输出相乘的结果保留前导零的情况。因此我们需要特别注意前导零的情况。"比如输入为"12",实际输出的结果应为"翻转后拼接起来相乘后的值"。所以对于此题我们应该像普通的大数乘法一样一位一位的去乘再加上之前的进位结果然后存入到数组中然后再一次翻转回来就可以得到最终的结果了。"这就是该题的一个核心思想:我们可以使用类似于竖式乘法的方式来计算两个数字的乘积只要我们能正确的处理进位和前导零的问题就可以了。"我们使用两个变量来表示两个数的乘积的中间部分,即从左到右每一段表示的位数都通过乘积产生的贡献进行计算得出的。这种处理方式类似与普通乘法的方法先计算低位再计算高位同时还需要处理进位的问题。"如果计算过程中出现了进位的情况我们就将进位值添加到下一次的计算中即可。"同时还需要注意一点的是我们需要从后向前遍历每个数的每一位进行乘法运算这样可以保证结果的正确性因为如果不从后向前遍历的话可能会导致结果的错位问题。"所以我们可以使用两个指针i和j分别指向两个数的末尾然后从后向前遍历每个数的每一位进行乘法运算同时还需要处理进位的问题最后将计算结果从高位到低位输出即可。"这种思路基于以下几点关键思路:翻转数的实现(通过STL中的reverse
      

      展开全部

      评论 编辑记录
      编辑
      预览

      报告相同问题?

    • 相关阅读:
      Feign源码解析:初始化过程(二)
      Druid连接池的快速使用
      聚焦云原生安全|如何为5G边缘云和工业互联网应用筑牢安全防线
      [NewStarCTF 2023 公开赛道]R!C!E!
      java计算机毕业设计web家庭财务管理系统MyBatis+系统+LW文档+源码+调试部署
      遍历List集合
      基于vue框架的uniapp小程序开发发现了新大陆
      超图Web许可无法访问
      <HarmonyOS第一课>从简单的页面开始——闯关习题及答案
      allatori8.0文档翻译-第六步:加水印但不混淆
    • 原文地址:https://ask.csdn.net/questions/8125175