【算法训练营】求最小公倍数+另类加法+走方格的方案数

news/2025/2/18 18:03:49/

00

7月31日

  • 求最小公倍数
    • 题目
    • 题解
    • 代码
  • 另类加法
    • 题目
    • 题解
    • 代码
  • 走方格的方案数
    • 题目
    • 题解
    • | 1 | 2 | 3 |
    • | 4 | 5 | 6 |
    • | 7 | 8 | 9 |
    • 代码

求最小公倍数

题目

00
点击跳转: 求最小公倍数

题解

最小公倍数 = 两数之积除以最大公约数,这里使用碾转相除法进行最大公约数的求解:即a与b的最大公约数可以转化为a、b之间的余数为两者之间最小的数之间的公约数。所以对于输入的两个数进行连续求余,直到余数为0,求余的分母即为结果。

代码

#include <iostream>
using namespace std;// 计算两个数的最大公约数
int GCD(int a, int b) {if (b == 0)return a;return GCD(b, a % b);
}int main() {int a, b;cin >> a >> b;// 求解最小公倍数int LCM = (a * b) / GCD(a, b);cout << LCM << endl;return 0;
}

另类加法

题目

00
点击跳转: 另类加法

题解

按位与和按位异或:
00

  • 【题目解析】
    本题的意思是自己实现加法,不适用现成的运算符,考察大家对于运算符的灵活运用
  • 【解题思路】:
    本题可以通过位运算实现,具体实现如下:
    两个数求和,其实就是 求和后当前位的数据+两个数求和的进位
    例如:
    1 + 2; 00000001 + 00000010
    求和后当前位的数据: 00000011 ; 求和后的进位数据: 没有进位,则 00000000
    两者相加,则得到: 00000011 就是3
    2 + 2; 00000010 + 00000010
    求和后当前位的数据: 00000000, 1和1进位后当前为变成0了
    求和后进位的数据: 00000100, 两个1求和后进位了
    相加后得到: 00000100 就是4
    求和后当前位的数据:简便的计算方法就是两个数进行异或 00000001 ^ 00000010 -> 00000011
    求和后进位的数据:简便的计算方法就是两个数相与后左移一位 (00000010 & 00000010) << 1
    所以这道题使用递归更加容易理解

代码

class UnusualAdd {public:int addAB(int A, int B) {if (A == 0) return B;if (B == 0) return A;int a = A ^ B;//求和后当前位的数据int b = (A & B) << 1;//求和后进位的数据return addAB(a, b);//递归两个数进行相加,任意为0时截止}
};

走方格的方案数

题目

链接: link00
点击跳转: 走方格的方案数

题解

本题为求取路径总数的题目,一般可以通过递归求解,对于复杂的问题,可以通过动态规划求解。此题比较简单,可以通过递归解答。
【解题思路】:
class UnusualAdd {
public:
int addAB(int A, int B) {
if (A == 0) return B;
if (B == 0) return A;
int a = A ^ B;//求和后当前位的数据
int b = (A & B) << 1;//求和后进位的数据
return addAB(a, b);//递归两个数进行相加,任意为0时截止
}
};

| 1 | 2 | 3 |

| 4 | 5 | 6 |

| 7 | 8 | 9 |

  1. 对于上面的nm(33)的格子,有两种情况
    a. 如果n或者m为1,则只有一行或者一列,从左上角走到右下角的路径数为n + m
    比如: 1 * 1格子,可以先向下走,再向右走,到达右下角;或者先向右走,
    再向下走,到达右下角,共两条,即 1 + 1 = 2,对于1 * m和 n * m的
    情况 自己画一下
    b. 如果n,m都大于1,那么走到[n][m]格子的右下角只有两条路径,
    <1>: 从[n - 1][m]格子的右下角向下走,到达
    <2>: 从[n][m - 1]格子的右下角向右走,到达
    所以走到[n][m]格子的右下角的数量为[n-1][m] + [n][m - 1],可以通过递归实现,情况a为递归的终止条件。

代码

#include<iostream>
using namespace std;
int pathNum(int n, int m) {if (n > 1 && m > 1)//b情况,递归return pathNum(n - 1, m) + pathNum(n, m - 1);else if (((n >= 1) && (m == 1)) || ((n == 1) && (m >= 1)))// a情况,终止条件return n + m;else//格子为0时, 路径为0return 0;
}
int main() {int n, m;while (cin >> n >> m){cout << pathNum(n, m) << endl;}return 0;
}

在这里插入图片描述


http://www.ppmy.cn/news/993467.html

相关文章

I.MX6ULL_Linux_驱动篇(41)platform设备驱动框架

我们在前面几章编写的设备驱动都非常的简单&#xff0c;都是对IO进行最简单的读写操作。像I2C、SPI、 LCD 等这些复杂外设的驱动就不能这么去写了&#xff0c; Linux 系统要考虑到驱动的可重用性&#xff0c;因此提出了驱动的分离与分层这样的软件思路&#xff0c;在这个思路下…

Linux之 centos、Ubuntu 安装常见程序

CentOS 安装 MySql 注意 需要有root权限 安装5.7版本 – 由于MySql并不在CentOS的官方仓库中&#xff0c;所以需要通过rmp命令&#xff1a; 导入MySQL仓库密钥 1、配置MySQL的yum仓库 配置yum仓库 更新密钥 rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022 安装…

quartus工具篇——fifo ip核

quartus工具篇——fifo ip核 1、简介 FPGA 中的 FIFO&#xff08;First-In, First-Out&#xff09;是一种常见的数据缓冲器&#xff0c;用于在不同的时钟域之间进行数据传输。FIFO 可以暂存一定数量的数据&#xff0c;并支持并行读取和写入操作&#xff0c;同时保持先进先出的…

SK5代理与网络安全:保障爬虫安全与效率的最佳选择

一、SK5代理和IP代理的概念及区别 SK5代理&#xff08;也称为socks5代理&#xff09;和IP代理是两种常见的代理技术。IP代理是通过代理服务器转发请求和响应&#xff0c;隐藏客户端的真实IP地址&#xff0c;从而实现匿名访问和绕过网络限制。SK5代理是一种特殊的代理协议&#…

【javascript】关于path-package

背景 一个老的vue项目&#xff0c;预览pdf文件的时候&#xff0c;电子签章不显示 解决方案 由于是老项目&#xff0c;升级版本存在风险&#xff0c;然后又找到一些解决方案&#xff0c;都是修改源码&#xff0c;修改源码就引出了今天的主题 path-package&#xff0c;我们需要…

Java课题笔记~数据库连接池

一、数据库连接池 1.1 数据库连接池简介 数据库连接池是个容器&#xff0c;负责分配、管理数据库连接(Connection) 它允许应用程序重复使用一个现有的数据库连接&#xff0c;而不是再重新建立一个&#xff1b; 释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数…

远距离传输大型文件:如何应对不同地区的网络环境和带宽约束

在现代社会中&#xff0c;远程传输大文件已经变得非常常见了。无论是个人生活还是各种组织之间的合作和协作&#xff0c;都需要频繁地进行文件传输。但是&#xff0c;由于不同地区的网络状况和带宽限制&#xff0c;传输大文件可能会遇到很多问题。因此&#xff0c;如何应对不同…

vue使用driver.js完成页面引导的功能

需求&#xff1a;给客户做一个页面引导&#xff0c;教客户怎么做 效果&#xff1a; driverjs官方文档 一.安装driver.js # Using npm npm install driver.js# Using pnpm pnpm install driver.js# Using yarn yarn add driver.js 二.在自己需要引导的页面上引入driver.js i…