当前位置: 首页 > news >正文

nowcoder NC10 大数乘法

题目链接: icon-default.png?t=N7T8https://www.nowcoder.com/practice/c4c488d4d40d4c4e9824c3650f7d5571?tpId=196&tqId=37177&rp=1&ru=/exam/company&qru=/exam/company&sourceUrl=%2Fexam%2Fcompany&difficulty=undefined&judgeStatus=undefined&tags=&title=

 

题目描述:

以字符串的形式读入两个数字,编写一个函数计算它们的乘积,以字符串形式返回。

数据范围: 读入的数字大小满足 0 \leqslant n \leqslant {10}^{1000}

要求:空间复杂度 O(m),时间复杂度 O(m^{2})(假设m是n的长度)

示例1:

输入:"11","99"

返回值:"1089"

说明:11*99=1089

示例2:

输入:"1","0"

返回值:"0"

答案:

import java.util.*;public class Solution {public String solve (String s, String t) {// write code hereif (s.charAt(0) == '0' || t.charAt(0) == '0'){return "0";}String ret = "0";String[] tmp = new String[t.length()]; for (int i = t.length() - 1; i >= 0; i--){tmp[i] = "";int j = t.length() - 1;while(j - i > 0){tmp[i] += '0';j--;}tmp[i] += alongMultiply(s, t.charAt(i));}for (int i = t.length() - 1; i >= 0; i--){ret = Add(tmp[i], ret);}StringBuffer stringBuffer = new StringBuffer();for (int i = ret.length() - 1; i >= 0; i--){stringBuffer.append(ret.charAt(i));}ret = stringBuffer.toString();return ret;}public String Add(String a, String b){String str = "";int aLen = a.length() - 1;int ai = 0;int bLen = b.length() - 1;int bi = 0;int ten = 0;while(aLen >= ai && bLen >= bi){int tmp = (a.charAt(ai++) - '0') + (b.charAt(bi++) - '0');tmp += ten;ten = tmp / 10;str += tmp % 10;}while(aLen >= ai){int tmp = a.charAt(ai++) - '0';tmp += ten;ten = tmp / 10;str += tmp % 10;}while(bLen >= bi){int tmp = b.charAt(bi++) - '0';tmp += ten;ten = tmp / 10;str += tmp % 10;}if (ten != 0){str += ten;}return str;}public String alongMultiply(String s, char t){String ret = "";if (s.charAt(0) == '0' || t == '0'){return "0";}int tt = t - '0';int ten = 0;for (int i = s.length() - 1; i >= 0; i--){int tmp = s.charAt(i) - '0';tmp *= tt;tmp += ten;ten = tmp / 10;ret += tmp % 10;}if (ten != 0){ret += ten;}return ret;}
}

详解: 

 从题目中我们可以得到以下几点信息:

  1. 输入值和返回值都是字符串类型;
  2. 输入值和返回值不可以直接转换成整数(因为数字过大);
  3. 对时间复杂度几乎没有要求;
  4. 不会出现负数乘法。

 当我们清楚了题目要求之后就该考虑该如何解题了。

 首先我们应该考虑的是乘法是如何进行计算的

我们以 11 * 99 为例:

 

我们可以分析得到无论是几位数的乘法都是按照以下步骤进行的:

  1. 将第一个数字分别乘以第二个数的每一位;
  2. 如果第一个数乘的是第二个数的个位就给结果乘一,十位就乘十 以此类推;
  3. 最后一步就是将各各结果相加。

到这一步之后如果你想在题目给的那一个方法里面实现这些内容就会大大提高你写代码的难度,此时其实我推荐将其用三个方法来实现。

  • 第一个为主函数,主要用来实现代码的整体思路;
  • 第二个为相乘的方法,其主要功能是实现一个 n 位数与一位数相乘;
  • 第三个为相加的方法,其主要功能是实现两个 n 位数的相加。

根据乘法的定义可以知道:0 与任何数相乘都是 0 所以我们的第一段代码就可以为:

    public String solve (String s, String t) {// write code hereif (s.charAt(0) == '0' || t.charAt(0) == '0'){return "0";}}

接下来就是对每一位进行相乘但是我们并不知道是 几位数与几位数进行相乘 所以我们此时应该根据 t 的长度来定义一个字符串数组 tmp 用来存储 t 中的每一位与 s 相乘的结果。

再定义一个名为 alongMultiply() 的方法 此方法就用来实现n 位数与一位数相乘并将其值以字符串的形式进行返回。(此方法可以先不急着实现)。

再定义一个名为 的字符串类型的变量,将其初始化为“0” 用来存储最终的返回值。

因为会有进位而导致最后结果的位数充满不确定性所以我们可以采用倒序的存储方式 

即:12345 存储为 54321

因为加法也会有进位所以我们可以在主方法的最后统一进行反转。

 public String solve (String s, String t) {// write code hereif (s.charAt(0) == '0' || t.charAt(0) == '0'){return "0";}String ret = "0";//新加的代码String[] tmp = new String[t.length()]; for (int i = t.length() - 1; i >= 0; i--){tmp[i] = "";int j = t.length() - 1;while(j - i > 0){ //相当于十位乘十 , 百位乘一百……tmp[i] += '0';j--;}tmp[i] += alongMultiply(s, t.charAt(i));}
}

紧接着我们再将 tmp数组 中的所有值进行相加存储在 ret 中。

for (int i = t.length() - 1; i >= 0; i--){ret = Add(tmp[i], ret);
}

到这里我们的整体布局已经完成了,接下来就该实现 alongMultiply() 方法了:

public String alongMultiply(String s, char t){String ret = ""; //用来存储最后的返回值if (s.charAt(0) == '0' || t == '0'){return "0";}int tt = t - '0';int ten = 0; //用来存储每次的进位for (int i = s.length() - 1; i >= 0; i--){int tmp = s.charAt(i) - '0';tmp *= tt;tmp += ten;ten = tmp / 10;ret += tmp % 10;}if (ten != 0){ret += ten;}return ret;}

 Add() 方法的实现:

public String Add(String a, String b){String str = ""; //存储最终的返回值int aLen = a.length() - 1;int ai = 0;int bLen = b.length() - 1;int bi = 0;int ten = 0; //用来存储每次的进位while(aLen >= ai && bLen >= bi){int tmp = (a.charAt(ai++) - '0') + (b.charAt(bi++) - '0');tmp += ten;ten = tmp / 10;str += tmp % 10;}while(aLen >= ai){int tmp = a.charAt(ai++) - '0';tmp += ten;ten = tmp / 10;str += tmp % 10;}while(bLen >= bi){int tmp = b.charAt(bi++) - '0';tmp += ten;ten = tmp / 10;str += tmp % 10;}if (ten != 0){str += ten;}return str;}

接下来我们只要再将最终的值进行反转本题就算做完了:

        StringBuffer stringBuffer = new StringBuffer();for (int i = ret.length() - 1; i >= 0; i--){stringBuffer.append(ret.charAt(i));}ret = stringBuffer.toString();

 当然你也可以用(我用上面的方法主要是因为它比较快):

        tmp[0] = ret;ret = "";for (int i = tmp[0].length() - 1; i >= 0; i--){ret += tmp[0].charAt(i);}

相关文章:

nowcoder NC10 大数乘法

题目链接: https://www.nowcoder.com/practice/c4c488d4d40d4c4e9824c3650f7d5571?tpId196&tqId37177&rp1&ru/exam/company&qru/exam/company&sourceUrl%2Fexam%2Fcompany&difficultyundefined&judgeStatusundefined&tags&tit…...

非科班菜鸡算法学习记录 | 代码随想录算法训练营第58天|| 单调栈! 739. 每日温度 496.下一个更大元素 I

739. 每日温度 输入一个数组&#xff0c;找比i天温度高的第一天 知识点&#xff1a;单调栈 状态&#xff1a;看思路自己写 思路&#xff1a; 看自己写的注释&#xff0c;维护一个单调栈 // 版本一 class Solution { public:vector<int> dailyTemperatures(vector<…...

【Luogu】 P5445 [APIO2019] 路灯

题目链接 点击打开链接 题目解法 转化很妙 考虑关路灯 x x x 的操作 令左边第一个未关的路灯为 L L L&#xff0c;右边第一个未关的路灯为 R R R&#xff0c;那么这一次会影响的区间即为 l ∈ [ L 1 , x ] , r ∈ [ x , R − 1 ] l\in[L1,x],\;r\in[x,R-1] l∈[L1,x],…...

Kafka3.0.0版本——消费者(独立消费者消费某一个主题中某个分区数据案例__订阅分区)

目录 一、独立消费者消费某一个主题中某个分区数据案例1.1、案例需求1.2、案例代码1.3、测试 一、独立消费者消费某一个主题中某个分区数据案例 1.1、案例需求 创建一个独立消费者&#xff0c;消费firstTopic主题 0 号分区的数据&#xff0c;所下图所示&#xff1a; 1.2、案…...

基于Simulink的用于电力系统动态分析

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

日200亿次调用,喜马拉雅网关的架构设计

说在前面 在40岁老架构师 尼恩的读者社区(50)中&#xff0c;很多小伙伴拿到一线互联网企业如阿里、网易、有赞、希音、百度、滴滴的面试资格。 最近&#xff0c;尼恩指导一个小伙伴简历&#xff0c;写了一个《API网关项目》&#xff0c;此项目帮这个小伙拿到 字节/阿里/微博/…...

构造函数和析构函数(个人学习笔记黑马学习)

构造函数:主要作用在于创建对象时为对象的成员属性赋值&#xff0c;构造函数由编译器自动调用&#xff0c;无须手动调用。析构函数:主要作用在于对象销毁前系统自动调用&#xff0c;执行一些清理工作。 #include <iostream> using namespace std;//对象初始化和清理class…...

GPT引领前沿与应用突破之GPT4科研实践技术与AI绘图教程

详情点击链接&#xff1a;GPT引领前沿与应用突破之GPT4科研实践技术与AI绘图教程 前沿 GPT对于每个科研人员已经成为不可或缺的辅助工具&#xff0c;不同的研究领域和项目具有不同的需求。 如在科研编程、绘图领域&#xff1a; 1、编程建议和示例代码: 无论你使用的编程语言是…...

Git上传新项目

第一步&#xff1a;初始化 Git 仓库 首先&#xff0c;打开终端或命令行界面&#xff0c;然后导航到项目目录。运行下面的命令来初始化一个新的 Git 仓库&#xff1a; git init这将创建一个新的 .git 子目录&#xff0c;其中包含了初始化的 Git 仓库。 第二步&#xff1a;添加…...

C语言文件操作总结

目录 字符方式读入文件 数据块方式读写文件 文件定位与随机读写 文件中数据的修改 字符方式读入文件 1.向文件中写入&#xff08;输入字符&#xff09; 用 fputc 函数或 puts 函数可以把一个字符写到磁盘文件中去。 int fputc(int ch,FILE * fp) ch 是要输出的字符&#…...

原生js之dom如何进行事件监听(事件捕获/冒泡)

那么好,这次主要讲解的就是dom是如何进行事件监听和事件取消监听的,我们知道vue中主要用watch来进行监听. js监听与取消监听 那么原生js主要用到的就是addListenEvent事件来进行监听,可以监听文档dom对象也可以监听浏览器bom对象,监听事件的语法结构如下 Dom/Bom监听 eleme…...

使用SimPowerSystems并网光伏阵列研究(Simulink实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

BUUCTF-WEB-[ACTF2020 新生赛]Includel

打开靶机 点击tips 利用Burp抓包&#xff0c;未见异常 但发现了响应头是 PHP/7.3.13 想到了"php://input"伪协议POST发送PHP代码 构建Payload&#xff1a;?filephp://filter/readconvert.base64-encode/resourceflag.php 这里需要注意的是使用php://filter伪协议…...

算法通关村十四关:白银挑战-堆能高效解决的经典问题

白银挑战-堆能高效解决的经典问题 1.在数组中找第K大的元素 LeetCode215 https://leetcode.cn/problems/kth-largest-element-in-an-array/ 思路分析 主要解决方法有3个&#xff0c;选择法&#xff0c;堆查找法和快速排序法 方法1&#xff1a;选择法 先遍历一遍找到最大的…...

跨站请求伪造(CSRF)攻击与防御原理

跨站请求伪造&#xff08;CSRF&#xff09; 1.1 CSRF原理 1.1.1 基本概念 跨站请求伪造&#xff08;Cross Site Request Forgery&#xff0c;CSRF&#xff09;是一种攻击&#xff0c;它强制浏览器客户端用户在当前对其进行身份验证后的Web 应用程序上执行非本意操作的攻击&a…...

从0到1实现播放控制器

这系列文章主要讲诉如何从0到1使用QT实现带时间显示、滚动字幕等的自定义配置视频播放控制器。平时我们乘坐地铁经常看到各条线的播放控制器都大同小异。其实都是通过QT等界面开发软件来实现的。 在具体开发之前&#xff0c;需要明确我们需要做什么&#xff1f; 1. 开发一个可…...

【Vue-Element-Admin】导出el-table全部数据

背景 因为el-table实现了分页查询&#xff0c;所以想要实现el-table需要重新编写一个查询全部数据的方法 查询全部数据 listQuery: export default{return{listQuery:{//page:1,//limit:20,//如果想兼容按条件导出&#xff0c;可以定义查询条件age:undefined,sex:undefined…...

MFC 更改控件的大小和位置

获取当前主窗体的位置rect CRect dlgNow;GetWindowRect(&dlgNow);获取某一个控件当前的位置 CRect rect;CButton* pBtn (CButton*)GetDlgItem(IDC_BUTTONXXX);//获取按钮控件pBtn->GetWindowRect(rect);CWnd* pWnd(CWnd*)GetDlgItem(IDC_EDITXXX);//其它控件&#xff0…...

【向量数据库】相似向量检索Faiss数据库的安装及余弦相似度计算(C++)

目录 简介安装方法安装OpenBLAS安装lapack编译Faiss 代码示例余弦相似度计算输出ID号而非索引的改进版 简介 Faiss 是一个强大的向量相似度搜索库&#xff0c;具有以下优点&#xff1a; 高效的搜索性能&#xff1a;Faiss 在处理大规模向量数据时表现出色。它利用了高度优化的索…...

教育培训小程序的设计与功能解析

随着互联网的发展&#xff0c;线上教育逐渐成为一种趋势&#xff0c;越来越多的人开始选择在线学习。而搭建一个适合自己的线上教育小程序&#xff0c;可以为教育机构或个人提供更好的教学和学习体验。在本文中&#xff0c;我们将介绍如何通过一个第三方制作平台来搭建在线教育…...

线性化加性模型与子尺度混合:实现概率空间直接可解释的机器学习

1. 项目概述与核心痛点 在金融风控、医疗诊断这些对决策过程要求“看得见、摸得着”的领域&#xff0c;我们这些从业者每天都在和模型的可解释性较劲。你肯定遇到过这种情况&#xff1a;业务方拿着一个逻辑回归模型的风险评分问你&#xff1a;“这个客户的‘历史逾期次数’这个…...

AI系列【仅供参考】:周末用笔记本搞点大事:手把手教学部署 1.5、7B 版本 DeepSeek 智能助手

周末用笔记本搞点大事&#xff1a;手把手教学部署 1.5、7B 版本 DeepSeek 智能助手周末用笔记本搞点大事&#xff1a;手把手教学部署 1.5、7B 版本 DeepSeek 智能助手一、工具介绍1.1 DeepSeek1.2 Ollama二、准备工作2.1 系统要求2.2 下载 Ollama 安装包三、Ollama 的安装与验证…...

Oracle EBS COA 嵌入 SAP 利润中心段:设计逻辑、哲学、思路、用途、优缺点深度分析

Oracle EBS COA 嵌入 SAP 利润中心段&#xff1a;设计逻辑、哲学、思路、用途、优缺点深度分析先明确核心前提&#xff1a; 你当前场景是集团双系统架构&#xff08;SAPOracle EBS&#xff09;&#xff0c;或Oracle EBS 承接 SAP 迁移 / 数据映射&#xff0c;计划在 EBS 会计科…...

深度揭秘:如何在Mac上无痛备份微信聊天记录

深度揭秘&#xff1a;如何在Mac上无痛备份微信聊天记录 【免费下载链接】WeChatExporter 一个可以快速导出、查看你的微信聊天记录的工具 项目地址: https://gitcode.com/gh_mirrors/wec/WeChatExporter 你是否曾因微信聊天记录丢失而懊恼&#xff1f;那些珍贵的对话、重…...

降AI率天花板!AI率92%暴降至5%!实测10款降AIGC平台!免费额度狂薅攻略

2026 年各大高校和期刊平台的 AI 检测系统又升级了&#xff0c;知网 AIGC、维普 AI、万方智能检测三大平台的算法迭代速度越来越快&#xff0c;上个月能蒙混过关的改写方式&#xff0c;这个月直接就会被标红预警。单纯的同义词替换、语序调整早就不管用了&#xff0c;想要有效降…...

C#与Unity的协作协议:从语法表层到引擎契约的深度解析

1. 这不是“学编程”&#xff0c;而是重新建立你和机器对话的语法系统很多人点开这个标题&#xff0c;心里想的是&#xff1a;“Unity游戏开发&#xff1f;那我得先学会C#&#xff0c;再学Unity编辑器&#xff0c;最后做个小飞机打砖块……”——这个思路本身就把门关死了。我带…...

AssetStudio深度解析:Unity序列化协议与产线级资源解包实战

1. 这不是“又一个AssetStudio教程”&#xff0c;而是我用它救回三个项目的真实记录AssetStudio、Unity资源提取、AssetBundle解包——这几个词&#xff0c;对做过Unity客户端开发、逆向分析、MOD制作或老游戏复刻的人来说&#xff0c;不是工具名&#xff0c;是救命稻草。我第一…...

ShiroAttack2实战指南:从漏洞检测到内存马注入的完整揭秘

ShiroAttack2实战指南&#xff1a;从漏洞检测到内存马注入的完整揭秘 【免费下载链接】ShiroAttack2 shiro反序列化漏洞综合利用,包含&#xff08;回显执行命令/注入内存马&#xff09;修复原版中NoCC的问题 https://github.com/j1anFen/shiro_attack 项目地址: https://gitc…...

Beyond Compare 5密钥生成器:从评估到期到永久授权的完整解决方案

Beyond Compare 5密钥生成器&#xff1a;从评估到期到永久授权的完整解决方案 【免费下载链接】BCompare_Keygen Keygen for BCompare 5 项目地址: https://gitcode.com/gh_mirrors/bc/BCompare_Keygen 你是否在使用Beyond Compare 5进行文件对比时&#xff0c;遇到了30…...

PyMICAPS:基于Python的气象数据可视化解决方案,提升Micaps数据处理效率300%

PyMICAPS&#xff1a;基于Python的气象数据可视化解决方案&#xff0c;提升Micaps数据处理效率300% 【免费下载链接】PyMICAPS 气象数据可视化&#xff0c;用matplotlib和basemap绘制micaps数据 项目地址: https://gitcode.com/gh_mirrors/py/PyMICAPS PyMICAPS是一个专…...