2-2基础算法-递归/进制转换

文章目录

  • 一.递归
  • 二.进制转换

一.递归

1.数的计算
在这里插入图片描述
评测系统

#include <iostream>
int countCombinations(int n) { //计算当然组合种数
    if (n == 1) {
        return 1;
    }
    int count = 1;//数字本身就是一个有效组合
    for (int i = 1; i <= n / 2; i++) {
        count += countCombinations(i);//自身+当前数所产生的组合种数
    }
    return count;
}
using namespace std;
int main()
{
    int n;
    cin >> n;
    cout<<countCombinations(n);
}

2.计算函数值
在这里插入图片描述
在这里插入图片描述

#include<iostream>
using namespace std;
int s(int x) {
    if (x == 0)
        return 1;
    else if (x % 2 == 0) {
        return s(x / 2);
    }
    else {
        return s(x - 1) + 1;
    }
}
int main() {
    int x;
    cin >> x;
    cout << s(x);
}

3.约瑟夫环

在这里插入图片描述

评测系统

#include <iostream>
using namespace std;
int f(int n,int k){
  if(n==1)
    return 1;
  else
    return (f(n-1,k)+k-1)%n+1;
}
int main()
{
  int n,k;
  cin>>n>>k;
  cout<<f(n,k);
  return 0;
}

4.金额查错
在这里插入图片描述
在这里插入图片描述
评测系统

解析:假设错误的总金额是 100 元,而明细账目清单上的金额总和是 120 元,那么可能遗漏的金额组合应该总和为 20 元,因为 120 - 100 = 20。题目要求找出所有可能的组合,使得这些组合的金额总和为 20 元。

第一次:count作为金额求和的结果,寻找可行的子串

#include <iostream>
#include <vector>
using namespace std;
void f(int i, int sum, int count, vector<int>& a, vector<int>& subset, vector<vector<int>>& result) {
    if (sum == count) {
        result.push_back(subset);
        return;
    }
    if (i == a.size() || sum > count) {
        return;
    }
    subset.push_back(a[i]);
    f(i + 1, sum + a[i], count, a, subset, result);//包含当前元素

    subset.pop_back();//不包含当前元素
    f(i + 1, sum, count, a, subset, result);
}
int main()
{
    int total,n;
    cin >> total>> n;
    vector<int> a(n);
    int sum = 0;
    for (int i = 0; i < n; i++) {
        cin >> a[i];
        sum += a[i];
    }
    int count=sum - total;
    vector<vector<int>> result;//存放最终结果
    vector<int> subset;//寻找满足条件的子集
    f(0, 0, count, a, subset, result);
    for (const auto& x : result) {
        for (int x2 : x) {
            cout << x2 << " ";
        }
        cout << endl;
    }
}

再考虑次序和去重问题,得到最终代码

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
void f(int i, int sum, int count, vector<int>& a, vector<int>& subset, vector<vector<int>>& result) {
    if (sum == count) {
        result.push_back(subset);
        return;
    }
    if (i == a.size() || sum > count) {
        return;
    }
    for (int j = i; j < a.size(); ++j) {
        if (j > i && a[j] == a[j - 1])
            continue;
        subset.push_back(a[j]);
        f(j + 1, sum + a[j], count, a, subset, result);
        subset.pop_back();
    }
}
int main()
{
    int total,n;
    cin >> total>> n;
    vector<int> a(n);
    int sum = 0;
    for (int i = 0; i < n; i++) {
        cin >> a[i];
        sum += a[i];
    }
    sort(a.begin(), a.end());//排序
    int count=sum - total;
    vector<vector<int>> result;//存放最终结果
    vector<int> subset;//寻找满足条件的子集
    f(0, 0, count, a, subset, result);
    for (const auto& x : result) {
        for (int x2 : x) {
            cout << x2 << " ";
        }
        cout << endl;
    }
}

二.进制转换

1.任意进制转十进制:x=xk+a

如十六转十

在这里插入图片描述

在这里插入图片描述
评测系统

#include <iostream>
using namespace std;
int main()
{
    string s = "2021ABCD";
    int a[100];//存放十六进制的每个数
    for (int i = 0; i < s.length(); i++) { //调整十六进制数
        if (s[i] >= '0' && s[i] <= '9') {
            a[i] = s[i]-'0';
        }
        else {
            a[i] = 10+s[i] - 'A';
        }
    }
    int x=0;//输出的十进制数
    for (int i = 0; i < s.length(); i++) { //【转换代码】
        x = x * 16 + a[i];
    }
    cout << x;
}

2.十进制转任意进制:通过数组a输出

while(x){
	a[cnt++]=x%k;
	x=x/k;
}
reverse(a,a+cnt);

在这里插入图片描述
评测系统

#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
int main()
{
    int T;
    cin >> T;
    while (T--) {
        int N, M;
        cin >> N >> M;
        string s;
        cin >> s;
        long long int a[100];
        
        //【先转成十进制】
        for (int i = 0; i < s.length(); i++) {
            if (s[i] >= '0' && s[i] <= '9') {
                a[i] = s[i] - '0';
            }
            else {
                a[i] = 10 + s[i] - 'A';
            }
        }
        long long int x = 0;//输出的十进制数
        for (int i = 0; i < s.length(); i++) {
            x = x * N + a[i];
        }
        if (M == 10) {
            cout << x << endl;
        }
        else { //【十进制转M进制】
            string b[100];
            int cnt = 0;
            while (x) {
                if (x % M >= 10) {
                    b[cnt++] = x % M - 10 + 'A';
                }
                else
                    b[cnt++] = to_string(x % M);
                x = x / M;
            }
            reverse(b, b + cnt);//翻转

            //输出
            for (int i = 0; i < cnt; i++) {
                cout << b[i];
            }
            cout << endl;
        }
    }
}

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

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

相关文章

风速预测(三)EMD-LSTM-Attention模型

目录 1 风速数据EMD分解与可视化 1.1 导入数据 1.2 EMD分解 2 数据集制作与预处理 2.1 先划分数据集&#xff0c;按照8&#xff1a;2划分训练集和测试集 2.2 设置滑动窗口大小为7&#xff0c;制作数据集 3 基于Pytorch的EMD-LSTM-Attention模型预测 3.1 数据加载&#…

Android Studio 实现音乐播放器

目录 一、引言 视频效果展示&#xff1a; 1.启动页效果 2.登录页效果 3.注册页效果 4.歌曲列表页效果 5.播放页效果 二、详细设计 1.登陆注册功能 2.音乐列表页面 2.音乐播放功能 三、源码获取 一、引言 Android初学者开发第一个完整的实例项目应该就属《音乐播放器…

redis:一、面试题常见分类+缓存穿透的定义、解决方案、布隆过滤器的原理和误判现象、面试回答模板

redis面试题常见分类 缓存穿透 定义 缓存穿透是一种现象&#xff0c;引发这种现象的原因大概率是遭到了恶意攻击。具体就是查询一个一定不存在的数据&#xff0c;mysql查询不到数据也不会直接写入缓存&#xff0c;就会导致这个数据的每次请求都需要查DB&#xff0c;数据库压力…

简洁应用框架VSEF的架构

本文介绍了一些简洁架构VSEF的一些框架结构理解&#xff0c;并且抛出了一些演化的主题&#xff0c;这些主题的不同思考会让系统发展成不同的风格&#xff0c;实际也是应用定位的必然结果。 总体 VSEF 架构理念 基本结构 演化 基本结构 入口 内核 依赖内核 简单逻辑 复杂…

「Leetcode」滑动窗口—长度最小的子数组

&#x1f4bb;文章目录 &#x1f4c4;题目✏️题目解析 & 思路&#x1f4d3;总结 &#x1f4c4;题目 209. 长度最小的子数组 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 连续子数组 [numsl, numsl1, …,…

小航助学2023年9月电子学会Scratch四级真题(含题库答题软件账号)

需要在线模拟训练的题库账号请点击 小航助学编程在线模拟试卷系统&#xff08;含题库答题软件账号&#xff09; 单选题3.00分 删除编辑附件图文 答案:A 第1题角色为一个紫色圆圈&#xff0c;运行程序后&#xff0c;舞台上的图案是&#xff1f;&#xff08; &#xff09; A…

Android 动画 Lottie 如何使用

Android 动画 Lottie 如何使用 一、简介 Lottie 是Airbnb开源的一个面向 iOS、Android、React Native 的动画库&#xff0c;能分析 Adobe After Effects 导出的动画&#xff0c;并且能让原生 App 像使用静态素材一样使用这些动画&#xff0c;完美实现动画效果。 二、Lottie动…

RRC下的NAS层

无线资源控制&#xff08;Radio Resource Control&#xff0c;RRC&#xff09;&#xff0c;又称为无线资源管理&#xff08;RRM&#xff09;或者无线资源分配&#xff08;RRA&#xff09;&#xff0c;是指通过一定的策略和手段进行无线资源管理、控制和调度&#xff0c;在满足服…

12.13_黑马数据结构与算法笔记Java

目录 098 堆 heapify 3 099 堆 增删替换 100 堆 e01 堆排序 100 堆e02 求数组第k大元素 100 堆e03 求数据流第k大元素 100 堆e04 求数据流中位数1 100 堆e04 求数据流中位数2 100 堆e04 求数据流中位数3 101 二叉树 概述 102 二叉树 深度优先遍历 103 二叉树 前中后…

人工智能导论习题集(2)

第三章&#xff1a;确定性推理 题1题2题3题4题5题6 题1 题2 题3 题4 题5 题6

Docker容器:docker推送镜像至Harbor

目录 1、Harbor创建项目 2、进入test项目&#xff0c;查看推送命令 3、在docker服务器上准备一个镜像 4、修改docker客户端配置 5、重启docker服务 6、docker登录Harbor 7、docker镜像推送到Harbor 1、Harbor创建项目 2、进入test项目&#xff0c;查看推送命令 3、在dock…

薅github的羊毛-用pages建自己的博客或资源站 - 博客工具 - 2/2

笔者调研了好多个静态博客工具&#xff0c;最后锁定Hexo了&#xff0c;但不等于其他博客不行。我只吐槽两个 Hugo - 难用Gridea - 简直就是骗钱的&#xff0c;我交钱用不了 theme没有链接&#xff0c;同步也同步不了&#xff0c;估计以前是可以&#xff0c;现在经营不下去&…

JUC并发编程 04——Java内存模型之JMM

一.CPU 缓存模型 为什么要弄一个 CPU 高速缓存呢&#xff1f; 类比我们开发网站后台系统使用的缓存&#xff08;比如 Redis&#xff09;是为了解决程序处理速度和访问常规关系型数据库速度不对等的问题。 CPU 缓存则是为了解决 CPU 处理速度和内存处理速度不对等的问题。 我们…

MDK 生成二进制bin文件 设置 任意路径

第一步&#xff1a;找到魔法&#xff0c; 第二步&#xff1a;拷贝语法到Run#1 : fromelf.exe --bin -o "$LL.bin" "#L" 第三步&#xff1a;点击Ok 第四步&#xff1a;重新编译即可生成bin文件

自炫锁2-b

1. 自旋锁 自旋锁也是为实现保护共享资源而提出一种锁机制。其实&#xff0c;自旋锁与互斥锁比较类似&#xff0c;它们都是为了解决对某项资源的互斥使用。 无论是互斥锁&#xff0c;还是自旋锁&#xff0c;在任何时刻&#xff0c;最多只能有一个保持者&#xff0c;也就说&…

CGAL的3D网格生成

1、介绍 该软件包致力于生成离散三维域的各向同性简化网格。要网格化的域是三维空间的子集&#xff0c;需要有界。域可以连接或由多个组件组成和/或细分为几个子域。 边界曲面和细分曲面是平滑曲面或分段平滑曲面&#xff0c;由平面或曲面面片形成。表面可能表现出一维特征&…

TCP/IP详解——ARP 协议

文章目录 一、ARP 协议1. ARP 数据包格式2. ARP 工作过程3. ARP 缓存4. ARP 请求5. ARP 响应6. ARP 代理7. ARP 探测IP冲突8. ARP 协议抓包分析9. ARP 断网攻击10. 总结 一、ARP 协议 ARP&#xff08;Address Resolution Protocol&#xff09;协议工作在网络层和数据链路层之间…

浅谈 USB Bulk 深入浅出 (3) - USB Bulk 装置传输的注意事项

来源&#xff1a;大大通 作者&#xff1a;冷氣團 1 USB Bulk 是什么 USB 是即插即用使用差动信号的装置界面&#xff0c;是以 端点 ( Endpoint )&#xff0c;做为传输装置的输出入端&#xff0c;透过不同的端点 ( Endpoint ) 和模式&#xff0c;来进行与装置的沟通&#xff…

WWW 指南-万维网联盟(World Wide Web)

WWW - 万维网联盟 WWW通常称为网络。 web是一个世界各地的计算机网络。 电脑在Web上使用标准语言沟通。 万维网联盟&#xff08;W3C&#xff09;制定了Web标准 什么是WWW&#xff1f; WWW 代表 World Wide Web(万维网)万维网常常被称为 网络网络是世界各地的计算机网络网络中…

nestjs守卫/全局守卫校验jwt

一、守卫 目标 部分接口需要用户登录后才可以访问&#xff0c;用户登录后可以颁发 jwt_token 给前端&#xff0c;前端在调用需要鉴权的接口&#xff0c;需要在请求头添加 jwt_token&#xff0c;后端校验通过才能继续访问&#xff0c;否则返回403无权访问 创建守卫 anth 安装…