进制算法题(进制转换、Alice和Bob的爱恨情仇)

 进制的本质

对于一个十进制数字,比如说153,其本质是每一个数位上的数字乘上这一位上的权重,即:153=(1x10^{2})+(5x10^{^{1}})+(3 x10^{0})而二进制,只不过是把10换成了2,任意一个非负整数都有唯一的一个二进制表示:
153_{10}=(10011001)_{2}
在计算机中,数字均通过二进制补码表示,所以学习进制转换尤为重要。

将任意进制转换为十进制

假设给了一个数组来表示一个k进制(假设K>10)的整数,我们该如何得到它的十进制数?

i = 1,[ x = 1 \times k^0 ]

i = 2,[ x = 1 \times k^1 + 3 \times k^0 ]

i =3,[ x = 1 \times k^2 + 3 \times k^1 + 10 \times k^0 ]

ll x = 0;
for (int i = 1; i <= n; ++i)
{x = x * k + a[i];
}
cout << x << '\n';

一般来说,这个k进制的数组可以通过对输入字符串的处理得到。

ll x; cin >> x;
while (x)a[++cnt] = x % k, x /= k;
reverse(a + 1, a + 1 + cnt);

例如十进制的11转换为二进制,根据这个规则得到的a数组为[1,1,0,1],而实际上11的二进制为[1,0,1,1]。

一、进制

问题描述
请问十六进制数 2021ABCD 对应的十进制是多少?
答案提交
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

解题思路

  1. 从右至左给每一位编号,最右边为第0位,依次为第1位、第2位……对于“2021abcd”,d是第0位,c是第1位,依此类推。

  2. 每一位上的数字乘以16的相应次方(权重)。例如,d(十进制值)乘以16^0,c乘以16^1,b乘以16^2,a乘以16^3,1乘以16^4,2乘以16^5,0乘以16^6(注意这里的0不影响结果),2乘以16^7。

  3. 将步骤2中得到的所有乘积相加,得到最终的十进制值。

二、进制转换

用户登录

题目描述
给定一个 N 进制数 S,请你将它转换为 M 进制。
输入描述
第一行为一个整数 T,表示测试数据数量。(1 ≤ T < 10°)每个测试用例包含两行,第一行包含两个整数 N,M第二行输入一个字符串 S,表示 N 进制数。
数据范围保证:2<N,M<16,若N >10,则用 A~ F 表示字码10 ~ 15。保证 S 对应的十进制数的位数不超过 10。
输出描述
输出共 T,每行表示一组数据的答案

#include<bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 1001;
int a[N];
char ch[] = { '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F' };void solve() {int n, m; cin >> n >> m;// 输入 n, m// n 表示 输入的n进制, m表示 需要输出 m进制string s; cin >> s;// 输入字符串int len = s.length();//获取字符串长度s = "#" + s; // 其他字符也行, 不是一定要 "#"// 在前面添加一个"#"字符,这是为了让字符串的索引从1开始,以方便处理。for (int i = 1; i <= len; ++i) {if ('0' <= s[i] && s[i] <= '9') { // 如果字符属于 0~9a[i] = s[i] - '0'; // 将字符直接转换为数字  }else { //如果属于大学字母a[i] = s[i] - 'A' + 10; // 将大写字母转换为数字(A=10, B=11, ...)  }}ll x = 0;for (int i = 1; i <= len; ++i) {x = x * n + a[i]; // 通过遍历数组a,将原始进制下的数转换为十进制数值x}string ans;// 将十进制数值 x转换为m进制的字符串表示answhile (x) {ans += ch[x % m];  x /= m;// 使用ch数组来找到每一位的字符表示,// 并通过不断除以目标进制m来获取下一个字符,直到x变为0}reverse(ans.begin(), ans.end());// 反转字符串以得到正确的顺序(如果需要的话)  cout << ans << '\n';  
}int main()
{ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);int T; cin >> T;// 输入一个整数 T, 表示测试数据数量while (T--)solve();// 多组数据输入return 0;
}

三、Alice和Bob的爱恨情仇

用户登录

问题描述

Bob和Alice通过博弈的方式来吃掉小饼干。他们将小饼干分成n堆,每堆有αi个小饼干。他们轮流对这些饼干进行操作,每次从一堆中拿出k^m个小饼干(k为奇数且m≥0,且km不能超出该堆的总数)。当一方操作后没有剩余的小饼干,则该方获胜。Alice先手,两人都会以最佳方法取饼干。请问谁能赢?

输入格式

第一行:两个正整数n(1≤n≤2×10^5)和k(1≤k≤10^9),分别表示饼干的堆数和每次取出饼干的底数。
第二行:n个整数,第i个表示第i堆小饼干有αi(1≤αi≤10^6)个小饼干。
输出格式

输出一行,包含一个字符串,表示Alice和Bob之中获胜的那个人。

诈骗题。
注意到 k 为奇数,而且每次至少可以取走一个石子。这意味着实际上
k^m 毫无意义,只与那一堆石子的奇偶数有关。更进一步,只与所有石
子堆的石子数之和的奇偶有关,若是奇数,则 Alice 胜,否则 Bob 胜。
时间复杂度 O(n)。

解题思路

k 是奇数
当 k 是奇数时,每次可以取走 (k^m) 个小饼干(m 是非负整数),由于 (k^m) 总是奇数(奇数的任何非负整数次幂都是奇数),因此:

如果一开始有 x 个小饼干,且 x 是奇数,那么先手总是可以取走 (k^m) 个小饼干,使得剩下的小饼干数量是偶数。然后无论后手如何取,先手总是可以取走 1 个小饼干,保持剩余小饼干数量为偶数。最终,先手将取走最后一个小饼干,赢得游戏。
如果一开始有 x 个小饼干,且 x 是偶数,那么无论先手如何取,后手总是可以取走 1 个小饼干,使得剩余小饼干数量为奇数。然后先手无论如何取,后手都可以取走 (k^m) 个小饼干,保持剩余小饼干数量为奇数。最终,后手将取走最后一个小饼干,赢得游戏。

在这道题中,题目还特别强调了 k 是奇数,由此我们可以进行大胆的推测这个博弈的结果跟奇偶数有很大关系。 由于每次取值都是 k 的幂次方,由于 k 是奇数,故每次取的数也将是奇数。

总结:

在一个奇数堆中,由于每次取不超过总数的奇数个数的饼干,所以我们到最后取完的时候一定会取奇数次,同理可得,在一个偶数堆中则是取偶数次。

故可知对于 (1,2,…,)(a1​,a2​,…,an​) 会有所对应的 (1,2,…,)(b1​,b2​,…,bn​) ,其中 bi​ == ( ai​ % 22 ) ,当 bi​ 为 1 时代表取奇数, bi​ 为 0 时代表取偶数。

由此可得出 ans= (1,2,…)(b1​,b2​,…,bn​) % 2,其中 ans 为 1 时代表总取数为奇数,即 Alice 赢,ans 为 0 时代表总取数为偶数,即 Bob 赢。

#include <bits/stdc++.h>void solve(const int &Case) {int n, k;std::cin >> n >> k;int ans = 0;for (int i = 0; i < n; i++) {int x;std::cin >> x;ans ^= x & 1;}if (ans > 0)std::cout << "Alice\n";else std::cout << "Bob\n";
}int main() {std::ios::sync_with_stdio(false);std::cin.tie(nullptr);std::cout.tie(nullptr);int T = 1;for (int i = 1; i <= T; i++)solve(i);return 0;
}

或者:

#include <iostream>
using namespace std;
long long ans,n,k,x;
int main()
{cin>>n>>k;while(n--){cin>>x;ans+=(x%2); }if(ans%2){cout<<"Alice";}else{cout<<"bob";}return 0;
}

今天就先到这了!!!

看到这里了还不给博主扣个:
⛳️ 点赞☀️收藏 ⭐️ 关注!

你们的点赞就是博主更新最大的动力!
有问题可以评论或者私信呢秒回哦。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python+django+vue电影票订购系统dyvv4

电影院订票信息管理系统综合网络空间开发设计要求。目的是将电影院订票通过网络平台将传统管理方式转换为在网上操作&#xff0c;方便快捷、安全性高、交易规范做了保障&#xff0c;目标明确。电影院订票信息管理系统可以将功能划分为用户和管理员功能[10]。 语言&#xff1a;…

HM2019创建分析模型

步骤一&#xff1a;查看单元类类型&#xff08;通过card edit&#xff09;&#xff0c;然后展开模型查看模型信息&#xff1b;步骤二&#xff1a;为材料集里添加新的材料 材料:Al 弹性模量E:70000 泊松比NU:0.33 其中&#xff1a;MAT1表示各向同性材料&#xff0c;E表示弹…

百度搜索引擎SEO优化方法

随着互联网的不断发展&#xff0c;搜索引擎已经成为人们获取信息、产品和服务的主要途径之一。而在中国&#xff0c;百度作为最大的搜索引擎&#xff0c;其影响力不可忽视。了解并掌握百度SEO关键词优化方法&#xff0c;对于提升网站在搜索引擎中的排名至关重要。 关键词选择&a…

Android应用开发data android:schemes标签的作用

文章目录 data android:schemesAndroidManifest.xml 中 <data> 元素的属性详解 data android:schemes 在 AndroidManifest.xml 文件中&#xff0c; 标签的作用是指定该应用可以处理的 URI 方案。 URI 是统一资源标识符&#xff0c;它是一种用于标识资源的标准方法。URI…

chrome浏览器离线安装及历史版本的下载

背景&#xff1a;测试web功能在浏览器各版本的兼容性&#xff0c;需要用到旧版本的浏览器&#xff0c;当用户环境无法访问到互联网&#xff0c;需要下载离线版本安装&#xff1b; 1、在线版本安装 需要当前环境能正常使用互联网&#xff1a; 目前能访问的官网地址&#xff1…

【C++精简版回顾】19.异常处理

1.throw抛出问题 int print(int a,int b) {if (b 0)throw b;return a / b; } 2.try与catch解决问题 try {print(2, 0); } catch (int b) {cout << "竟然是&#xff1a;"<<b<<endl; } 结果&#xff1a; 补充1&#xff1a;可以抛出字符串等 1.throw…

前端小案例——登录界面(正则验证, 附源码)

一、前言 实现功能&#xff1a; 提供用户名和密码输入框。当用户提交表单时&#xff0c;阻止默认提交行为。使用正则表达式验证用户输入的内容&#xff0c;判断输入的是有效的邮箱地址还是身份证号码。根据验证结果&#xff0c;在输入框下方显示相应的提示信息。 实现逻辑&a…

下载、安装Notepad++代码编辑器的方法

本文介绍下载、安装Notepad 软件的方法。 关于Notepad&#xff0c;只能说从软件自身角度还算个东西&#xff1b;其是一款免费的代码、文本编辑器&#xff08;通过一些插件&#xff0c;它也可以成为编译器&#xff0c;不过我没试过&#xff09;&#xff0c;是广受大家欢迎的开源…

蓝桥杯备赛 day2 | 4. 付账问题 5. 数字三角形

付账问题&#xff0c;关键是要了解整型的范围&#xff0c;确定获取输入数据的变量类型 需要注意的是int的十进制范围-32768 ~ 32767&#xff0c;那么我们可以知道&#xff0c;人数n是可以用int来装的&#xff0c;需付款数S应该是long long&#xff0c;获取的每个人初始钱数也应…

22万字大模型面经整理+答案

槽位对齐&#xff08;slot alignment&#xff09; 在text2sql任务中&#xff0c;槽位对齐&#xff08;slot alignment&#xff09;通常指的是将自然语言问题中的关键信息&#xff08;槽位&#xff09;与数据库中的列名或API调用中的参数进行匹配的过程。这个过程中&#xff0c…

内衣洗衣机名牌排行榜前十名:十款强大性能内衣洗衣机精心力荐

小型内衣洗衣机一般是为婴儿宝宝&#xff0c;或者一些有特殊需要的用户而设计使用的&#xff0c;宝宝衣物换洗频繁&#xff0c;而且对卫生方面的除菌要求高&#xff0c;而为避免交叉感染&#xff0c;所以一般不适合和大人的衣物放在一起洗&#xff0c;因此对于有宝宝的家庭来说…

用友NC saveDoc.ajax 任意文件上传漏洞复现

产品介绍 用友NC是一款企业级ERP软件。作为一种信息化管理工具&#xff0c;用友NC提供了一系列业务管理模块&#xff0c;包括财务会计、采购管理、销售管理、物料管理、生产计划和人力资源管理等&#xff0c;帮助企业实现数字化转型和高效管理。 漏洞描述 用友NC 系统 saveD…

接口测试要怎么测?接口测试的流程和步骤详解

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 关注公众号【互联网杂货铺】&#xff0c;回复 1 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、什么是接口测试 我们要想知道接口测试怎么做&#xff0c;首…

Python 弱引用全解析:深入探讨对象引用机制!

目录 前言 弱引用的概述 弱引用的原理 使用 WeakRef 类创建弱引用 使用 WeakValueDictionary 类创建弱引用字典 实际应用场景 1. 解决循环引用问题 2. 对象缓存 总结 前言 在Python编程中&#xff0c;弱引用&#xff08;Weak Reference&#xff09;是一种特殊的引用方式…

python高级之元类

python高级之元类 一、Type创建类1、传统方式创建类2、非传统方式 二、元类三、总结 一、Type创建类 class A(object):def __init__(self, name):self.name namedef __new__(cls, *args, **kwargs):data object.__new__(cls)return data根据类创建对象 objA(‘kobe’) 1、执…

C++之智能指针

为什么会有智能指针 前面我们知道使用异常可能会导致部分资源没有被正常释放, 因为异常抛出之后会直接跳转到捕获异常的地方从而跳过了一些很重要的的代码, 比如说下面的情况&#xff1a; int div() {int a, b;cin >> a >> b;if (b 0)throw invalid_argument(&q…

《程序员的职业迷宫:选择你的职业赛道》

程序员如何选择职业赛道&#xff1f; 大家好&#xff0c;我是小明&#xff0c;一名在编程迷宫中探索的程序员。作为这个庞大迷宫的探险者&#xff0c;我深知选择适合自己的职业赛道有多么重要。今天&#xff0c;我将分享一些关于如何选择职业赛道的心得&#xff0c;希望能够帮…

爬虫案例二

想拿到电影天堂 其中一个下载地址如何实现呢 第一步电影天堂_免费在线观看_迅雷电影下载_电影天堂网 (dytt28.com)电影天堂_电影下载_高清首发 (dytt89.com)电影天堂_免费在线观看_迅雷电影下载_电影天堂网 (dytt28.com) 第一步 我直接打开 requests.exceptions.SSLError: H…

C语言——结构体(位段)、联合体、枚举

hello&#xff0c;大家好&#xff01;我是柚子&#xff0c;今天给大家分享的内容是C语言中的自定义类型结构体、联合体以及枚举&#xff0c;有什么疑问或建议可以在评论区留言&#xff0c;会顺评论区回访哦~ 一、结构体 struct a.结构体声明 不同于数组的是&#xff0c;结构…

分布式ID生成算法|雪花算法 Snowflake | Go实现

写在前面 在分布式领域中&#xff0c;不可避免的需要生成一个全局唯一ID。而在近几年的发展中有许多分布式ID生成算法&#xff0c;比较经典的就是 Twitter 的雪花算法(Snowflake Algorithm)。当然国内也有美团的基于snowflake改进的Leaf算法。那么今天我们就来介绍一下雪花算法…