每日练习——同余方程以及格雷码

同余方程

题目描述

运行代码

#include<iostream>
#define ll long long
using namespace std;
ll exgcd(ll a, ll b, ll& x, ll& y) {
	if (!b)return x = 1, y = 0, a;
	ll d = exgcd(b, a % b, y, x);
	y -= a / b * x;
	return d;
}
int main() {
		ll a, b, x, y;
		cin >> a >> b;
		ll d = exgcd(a, b, x, y);
		cout << (x + b) % b << endl;
	return 0;
}

代码思路

求解线性同余方程以及使用扩展欧几里得算法(Extended Euclidean Algorithm)求最大公约数(GCD)的功能。

扩展欧几里得算法(exgcd)

扩展欧几里得算法不仅仅计算两个整数a和b的最大公约数(GCD),还会找到一对整数x和y,满足以下等式:

ax + by = gcd(a, b)ax+by=gcd(a,b)

这里是算法的核心逻辑:

  1. 基本情况:如果b为0,说明a就是最大公约数,此时设置x=1,y=0,直接返回a。
  2. 递归调用:否则,递归调用exgcd(b, a % b, y, x),这里交换了x和y的位置以便正确计算x和y的值。
  3. 更新x和y:根据递归调用返回的解,更新y的值为y - (a/b) * x,这里(a/b)是指整除,确保结果仍然是整数。
  4. 返回结果:最后返回计算得到的最大公约数d。

主函数(main)

  1. 输入:从用户那里接收两个整数a和b。
  2. 调用exgcd:使用exgcd(a, b, x, y)函数,求解a和b的最大公约数,并找到对应的x和y。
  3. 输出解的一部分:根据中国剩余定理或者其他相关应用场景,输出表达式(x + b) % b的结果。这里特别说明一下,这个输出并不直接对应于求解线性同余方程的标准形式解的展示,而是展示了一个特定操作的结果。通常,解决同余方程的目标是找到满足ax ≡ 1 (mod b)的x,即a关于b的乘法逆元,但这里的输出更像是一种示例操作,可能用于展示x的一个简单变形或特定场景的应用。

格雷码

题目描述

运行代码

#include<iostream>
#include<cstring>
#include<vector>
using namespace std;
#define ull unsigned long long
int main(){
    int n;
    ull a[65],k;
    string s;
    cin>>n>>k;
    a[0]=1;
    for(int i=1;i<=64;i++)
        a[i]=(a[i-1]<<1);
    for(int i=0;i<=64;i++)
        a[i]--;
    s.clear();
    while(n>=1){
        if(k>a[n-1])
            s+='1',k=a[n]-k;
        else s+='0';
        --n;
    }
    cout<<s<<endl;
}

代码思路

该程序首先计算每个二进制位上能表示的最大值(实际上是从1到2^n - 1的序列),然后根据输入的k值,决定在构造的二进制字符串中放置'1'还是'0'。下面是详细的代码思路分析:

  1. 初始化:

    • 定义数组a用于存储从1个二进制位到64个二进制位所能表示的最大值。a[0]=1,之后每一项都是前一项左移一位再减1(即a[i] = (a[i-1] << 1) - 1),这是因为二进制位上能表示的最大数是从1开始的,如1位二进制最大是1(即2^1 - 1),2位是3(即2^2 - 1)等。
    • 定义变量n存储位数,k存储要定位的值,s为最终输出的二进制字符串。
  2. 计算每个二进制位的最大值:

    • 使用循环计算并存储每个二进制位的最大值到数组a中。这一步是为后续比较做准备。
  3. 构建二进制字符串:

    • 进行循环,每次循环检查当前位(从最高位到最低位)是否足够放置k。如果k大于或等于当前位的最大值(即a[n-1]),说明当前位应该是1(因为k在这个范围内),并且从k中减去当前位能表示的值(a[n] - k),然后将s的当前位设置为'1'。否则,如果k小于当前位的最大值,则在s中放置'0'。
    • 每次处理完一个位,就减少n的值,表示考虑下一个更低的二进制位。
  4. 输出结果:当所有的位都被处理过后,输出构建好的二进制字符串s

注意点

使用的是unsigned long long,而不是long long数据类型,注意二进制可以表示正负,如果是long long ,数据通过度不够。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/647975.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【教学类-58-05】黑白三角拼图05(2-10宫格,每个宫格随机1张-6张,带空格纸,1页3张黑白3张白卡)

背景需求&#xff1a; 【教学类-58-04】黑白三角拼图04&#xff08;2-10宫格&#xff0c;每个宫格随机1张-6张&#xff0c;带空格纸&#xff0c;1页6张黑白&#xff0c;1张6张白卡&#xff09;-CSDN博客文章浏览阅读582次&#xff0c;点赞16次&#xff0c;收藏3次。【教学类-58…

Kafka 安装教程和基本操作

一、简介 Kafka 是最初由 Linkedin 公司开发&#xff0c;是一个分布式、分区的、多副本的、多订阅者&#xff0c;基于 zookeeper 协调的分布式日志系统&#xff08;也可以当做 MQ 系统&#xff09;&#xff0c;常见可以用于 web/nginx 日志、访问日志&#xff0c;消息服务等等…

C++之lambda函数与std::bind区别及用法实例(二百八十)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

AI网络爬虫-从当当网批量获取图书信息

工作任务和目标&#xff1a;用户输入一个图书名称&#xff0c;然后程序自动从当当网批量获取图书信息 查看相关元素在源代码中的位置&#xff1a; 第一步&#xff1a;在deepseek中输入提示词&#xff1a; 你是一个Python爬虫专家&#xff0c;一步步的思考&#xff0c;完成以下…

5.26机器人基础-DH参数 正解

1.建立DH坐标系 1.确定Zi轴&#xff08;关节轴&#xff09; 2.确定基础坐标系 3.确定Xi方向&#xff08;垂直于zi和zi1的平面&#xff09; 4.完全确定各个坐标系 例子&#xff1a; 坐标系的布局是由个人决定的&#xff0c;可以有不同的选择 标准坐标系布局&#xff1a; …

HAL库LED点灯

一、搭建开发环境 &#xff08;一&#xff09;安装MDK5 具体安装请参照下面链接&#xff1a;如何开始一个stm32的简单程序的编译_stm32程序编译-CSDN博客 &#xff08;二&#xff09;安装Jdk 由于STM32CubeMX需要用到JAVA&#xff0c;因此需要安装jdk环境。 jdk官网下载链接…

素数判断的奥秘与编程实践

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、素数定义的深入理解 二、非素数的例子与思考 三、素数判断的编程实现 1. 穷举法判断素…

protobuf —— 认识和安装

protobuf —— 认识和安装 什么是序列化和反序列化有哪些常见的什么是序列化和反序列化工具Protobuf安装安装依赖开始安装 连接动态库一些遗留问题 我们今天来看一个序列化和反序列化的工具&#xff1a;protobuf。 什么是序列化和反序列化 序列化&#xff08;Serialization&a…

基于SpringBoot和Mybatis实现的留言板案例

目录 一、需求及界面展示 二、准备工作 引入依赖 .yml文件相关配置 数据库数据准备 三、编写后端代码 需求分析 代码结构 Model Mapper Service Controller 前端代码 四、测试 一、需求及界面展示 需求&#xff1a; 1. 输入留言信息&#xff0c;点击提交&…

MySQL:图文超详细教程MySQL5.7下载与安装

一、前言 MySQL 5.7 是一个重要的数据库管理系统版本&#xff0c;它带来了多项改进和新特性&#xff0c;本文将超详细的带大家手动安装一下MySQL5.7。 二、下载MySQL5.7版本 MySQL5.7安装包 链接&#xff1a;https://pan.baidu.com/s/1lz5rp9PwfyeHzkEfI_lW6A 提取码&#…

MyBatis框架的使用:mybatis介绍+环境搭建+基础sql的使用+如何使用Map传入多个参数+返回多个实体用List或者Map接收+特殊sql的使用

MyBatis框架的使用&#xff1a;mybatis介绍环境搭建基础sql的使用如何使用Map传入多个参数返回多个实体用List或者Map接收特殊sql的使用 一、MyBatis介绍1.1 特性1.2 下载地址1.3 和其它持久层技术对比 二、搭建环境2.1配置maven2.2 创建mybatis配置文件2.3 搭建测试环境 三、基…

spring状态机实战

引言 完整代码库gitee地址:代码地址 一、什么是状态机 状态机是有限状态自动机的简称&#xff0c;是现实事物运行规则抽象而成的一个数学模型&#xff0c;是一种概念性机器&#xff0c;它能采取某种操作来响应一个外部事件。这种操作不仅能取决于接收到的事件&#xff0c;还…

如何使用Rust构建Python原生库?注意,不是动态链接库!!!

参考文档&#xff1a;https://github.com/PyO3/pyo3 创建python虚拟环境&#xff1a; conda create --name pyo3 python3.11.7激活虚拟环境&#xff1a; conda activate pyo3安装依赖&#xff1a; pip install maturin初始化项目&#xff1a; maturin init构建项目&#x…

搜索二叉树(C++)

文章目录 1. 搜索二叉树的概念2. 搜索二叉树结构的定义3. 搜索二叉树的操作3.1 搜索二叉树的插入3.2 搜索二叉树的删除3.3 搜索二叉树的查找 4. 完整代码 1. 搜索二叉树的概念 二叉搜索树&#xff08;Binary Search Tree&#xff0c;简称 BST&#xff09;&#xff0c;又称二叉…

Android Studio 获取 SHA1

以 debug.keystore 调试密钥库为例。 步骤1&#xff1a;明确 debug.keystore 位置 debug.keystore 在 .android 目录下&#xff1a; Windows 用户&#xff1a;C:\Users\用户名\.android\debug.keystore Mac 用户&#xff1a;/Users/用户名/.android/debug.keystore 假设我的…

在Windows中安装Redis

一、下载Redis github链接&#xff1a;https://github.com/redis-windows/redis-windows/releases 二、安装 解压后点击start.bat文件即可启动服务 新开一个cmd窗口进入安装了Redis的文件夹输入redis-cli.exe -h 127.0.0.1 -p 6379连接Redis&#xff0c;见如下结果便是成功&…

数据结构——链式二叉树知识点以及链式二叉树数据操作函数详解!!

引言&#xff1a;该博客将会详细的讲解二叉树的三种遍历方法&#xff1a;前序、中序、后序&#xff0c;也同时会讲到关于二叉树的数据操作函数。值得一提的是&#xff0c;这些函数几乎都是建立在一个函数思想——递归之上的。这次的代码其实写起来十分简单&#xff0c;用不了几…

【Springboot系列】SpringBoot 中的日志如何工作的,看完这一篇就够了

文章目录 强烈推荐引言Spring Boot 中的日志是怎么工作日志框架选择配置文件日志级别自定义日志配置集成第三方日志库实时监控和日志管理 Log4j2工作原理分析1. 核心组件2. 配置文件3. Logger的继承和层次结构4. 日志事件处理流程5. 异步日志 总结强烈推荐专栏集锦写在最后 强烈…

免费图片文字转换成文本,ocr文字识别软件免费版,真的太实用了!

截屏短视频上一段扎心文字&#xff0c;想把它发到朋友圈怎么办&#xff1f;这时候就需要一个OCR识别软件。 它就像一个聪明的小助手&#xff0c;它可以帮助电脑“看懂”书本上或者图片里的字。就像我们用眼睛看字一样&#xff0c;OCR软件用它的“眼睛”扫描图片&#xff0c;识…

C语言代码错误(一)

今天在写选择排序代码时&#xff0c;在测试数据发现不能显示结果 1、代码如下&#xff1a; #include <stdio.h>int main(void) {int i, j; // 循环变量int MinIndex; // 保存最小的值的下标int buf; // 互换数据时的临时变量int n;printf("你想输入多少个数据n:\n…