C++基础算法⑦——信奥一本通递归算法(放苹果、求最大公约数问题、2的幂次方表示、分数求和、因子分解、判断元素是否存在)

news2024/11/20 7:30:57

递归算法

    • 1206:放苹果
    • 1207:求最大公约数问题
    • 1208:2的幂次方表示
    • 1209:分数求和
    • 1210:因子分解
    • 1211:判断元素是否存在

1206:放苹果

在这里插入图片描述
这道题还是有些难度的,我们要考虑几种放苹果的情况。我默默把m代表苹果,n代表盘子。

  1. 先把输入搞定,这个还是简简单单的。
int main(){
	//多苹果,少盘子 
	//	例如f(4)(3) = f(4-3)(3) + f(4)(2); 
	//	f(4)(2) = f(4-2)(2)+f(4)(1);
	//测试数据次数 
	cin>>t;
	for(int i=1;i<=t;i++){
		int a,b;
		cin>>a>>b; //输入每组数据 
		cout<<apple(a,b)<<endl; 
	}
	return 0;
}
  1. 用apple函数求放苹果的次数。我们知道
    多个苹果,0盘子; 多个苹果,1盘子;
    0个苹果,多盘子;1个苹果,多盘子;
    都只有一种方法哈。
if(m==0||m==1||n==0||n==1) 
	return f[m][n]=1;
  • 第二种放苹果情况,就是 少苹果 多盘子,应该怎么放?

    注意 题目讲道:
    1 2 第一个盘子放1个苹果,第二个盘子放2个苹果;
    2 1 第一个盘子放2个苹果,第二个盘子放1个苹果;
    是一样的,只算一种方法。
    在这里插入图片描述
    那上面图片:橙色线的放法 1 1 1 1 0 ;紫色线的放法 0 1 1 1 1 都算同一种; 4苹果🍎5盘子,其实就相当于 4苹果🍎4盘子的方法。代码表示则

return f[m][n] = apple(m,m);
  1. 最后一种情况:多苹果少盘子。
    那这样,会出现每个盘子都至少有苹果🍎; 另外情况就是 有盘子没放苹果🍎; 把这两种可能加起来就是多苹果🍎少盘子的放法。
    在这里插入图片描述
    会出现每个盘子都至少有苹果🍎 那上面图片是不是有一个苹果没放对吧! 1个苹果3个盘子的放法是:
apple(4-3,3); //m苹果🍎,n盘子
apple(m-n,n);

在这里插入图片描述

上图是有盘子没放苹果🍎的情况,则变成4个苹果🍎2个盘子的放法是:

apple(4,3-1); //m苹果🍎,n盘子
apple(m,n-1);

完整代码:

#include<bits/stdc++.h>
using namespace std;
int m,n,t; //m代表苹果,n代表盘子
int f[15][15]={0}; 
int apple(int m,int n){
// 多个苹果,0盘子; 多个苹果,1盘子; 
//	0个苹果,多盘子;1个苹果,多盘子; 都只有一种 
	if(m==0||m==1||n==0||n==1) return f[m][n]=1;
	if(m>=n){ //多苹果,少盘子 
		return f[m][n] = apple(m-n,n) + apple(m,n-1);
	}
	else{
		return f[m][n] = apple(m,m);
	}
	
} 
int main(){
	//多苹果,少盘子 
	//	例如f(4)(3) = f(4-3)(3) + f(4)(2); 
	//	f(4)(2) = f(4-2)(2)+f(4)(1);
	//测试数据次数 
	cin>>t;
	for(int i=1;i<=t;i++){
		int a,b;
		cin>>a>>b; //输入每组数据 
		cout<<apple(a,b)<<endl; 
	}
	return 0;
}

1207:求最大公约数问题

在这里插入图片描述
最大公约数用辗转相除法做即可。

#include<iostream>
using namespace std;
int gcd(int a,int b){
	if(b==0) return a;
	return gcd(b,a%b); 
}

int a,b;
int main(){
	cin>>a>>b;
	cout<<gcd(a,b);
	return 0;
}

1208:2的幂次方表示

在这里插入图片描述

  1. 输入一个值,这个值从0次方开始拆分
int main(){
	int n;
	cin>>n;
	f(n,0); 
	return 0;
}

173 怎么得出2的几次方呢? 值n用短除法,不断➗2,有余数1代表次方有。除一次2,就次方k+1;直到n除到0结束。

void f(int n,int k){    //n是值,k是几方数 
	if(n==0) return ;  //值0,结束 
	n /= 2;
	f(n,k+1); 		  //不断除2,往下搜 

根据题目要求,分解要在余数为1的情况:

  • 2的0次方分解: 2(0)
  • 2的1次方分解: 2
  • 2的2次方分解: 2(2)
  • 2的2次方以上分解: 以次方k的值作为n,重新调用函数进行次方的再次分解。
if(yu==1){ //有余数,就输出 
//		cout<<"2("<<k<<")";
		if(k==0) cout<<"2(0)";
		else if(k==1) cout<<"2";
		else if(k==2) cout<<"2(2)"; 
		else{ //超过2的次方重新模拟调用 
			cout<<"2(";
			f(k,0);//对7再进行模拟
			cout<<")"; 
		}
	} 

题目输出要有+号。注意当有余数和值不为0情况。

if(n!=0 && yu!=0) cout<<"+"; 

完整代码:

#include<bits/stdc++.h>
using namespace std;
void f(int n,int k){    //k是次方数 
	if(n==0) return ;  //值0,结束 
	int yu = n % 2;   //求余数 
	n /= 2;
	f(n,k+1); 		  //不断除2,往下搜 
//	2进制数,哪个次方数是1、是0; 137= 010001001; 128+8+1
	if(n!=0 && yu!=0) cout<<"+";  
	if(yu==1){ //有余数,就输出 
//		cout<<"2("<<k<<")";
		if(k==0) cout<<"2(0)";
		else if(k==1) cout<<"2";
		else if(k==2) cout<<"2(2)"; 
		else{ //超过2的次方重新模拟调用 
			cout<<"2(";
			f(k,0);//对7再进行模拟
			cout<<")"; 
		}
	} 
}
int main(){
	int n;
	cin>>n;
	f(n,0); 
	return 0;
}

1209:分数求和

在这里插入图片描述在这里插入图片描述
由题目可知,要模拟出分数相加的情况,也就是分母相乘,分子通分求和,在最后进行化简。

  1. 要定义变量,第一次输入值 表示第一个数的分子,分母。
int main(){
	int a,b,n,fz,fm;
	char c;
	cin>>n;
	cin>>a>>c>>b;
	fz = a;
	fm = b;
  1. 接着从第二个值的分数到第n个分数逐个输入,输入一个分数我们就进行通分操作。
for(int i=2;i<=n;i++){
		cin>>a>>c>>b;
  • 分子通分:fz = fz*b + fm*a; //分子
  • 分母相乘:fm = fm*b; //分母
  1. 对通分的结果,进行最简化,那我们要同时分子分母除以最大的共同因子,也就是最大公约数。
int gcd(int a,int b){
	if(b==0) return a;
	return gcd(b,a%b);
}

	int yue = gcd(fz,fm);
	fz /= yue; //约分 
	fm /= yue; //约分 

最后判断分母是1就直接输出分子。

	if(fm==1) cout<<fz<<endl; //分母是1,直接输出分子
	else cout<<fz<<"/"<<fm<<endl; 

完整代码:

#include<bits/stdc++.h>
using namespace std;
int gcd(int a,int b){
	if(b==0) return a;
	return gcd(b,a%b);
}
int main(){
	int a,b,n,fz,fm;
	char c;
	cin>>n;
	cin>>a>>c>>b;
	fz = a;
	fm = b;
	for(int i=2;i<=n;i++){
		cin>>a>>c>>b;
		fz = fz*b + fm*a; //分子 
		fm = fm*b; //分母
		int yue = gcd(fz,fm);
		fz /= yue; //约分 
		fm /= yue; //约分 
	}
	if(fm==1) cout<<fz<<endl; //分母是1,直接输出分子
	else cout<<fz<<"/"<<fm<<endl; 	 
	return 0;
}

1210:因子分解

在这里插入图片描述
对n 从2到n进行除法,能被整除代表改因子可以分解。

int main(){
	int n,cnt=0,f=0;
	cin>>n;
	for(int i=2;i<=n;i++){
		//判断整除
	}

如果能被整除,就统计这个因子 i 的次数 cnt+1。接着再对n进行分解,直到分解不了。

//		1.判断能被整除
		if(n%i==0){
			cnt = 0; //统计分解的次数
			while(n%i==0){ //实现数字的分解 
				n = n/i;
				cnt++;
			}

再这个因子的次数有无超过1,有要输出 “^”;
乘号 * 输出在两个数中间。 最后判断n分解到值1就结束循环。

		if(f==0) f=1;  //保证乘号不能第一次
		else cout<<"*";
		cout<<i;
		if(cnt>1) cout<<"^"<<cnt;
		if(n==1) return 0; 

完整代码

#include<bits/stdc++.h>
using namespace std;
int main(){
	int n,cnt=0,f=0;
	cin>>n;
	for(int i=2;i<=n;i++){
//		1.判断能被整除
		if(n%i==0){
			cnt = 0; //统计分解的次数
			while(n%i==0){ //实现数字的分解 
				n = n/i;
				cnt++;
			}
			if(f==0) f=1;
			else cout<<"*";
			cout<<i;
			if(cnt>1) cout<<"^"<<cnt;
			if(n==1) return 0; 
		} 
	} 
	return 0;
}

1211:判断元素是否存在

在这里插入图片描述在这里插入图片描述
1.题目输入需要用到,c语言的输入方式。输入完判断是否满足条件,是就输出YES,否则NO。用函数去完成判断条件

int main(){
//	cin>>k>>x;
	scanf("%d,%d",&k,&x);
	if(search(k)){
		cout<<"YES";
	}
	else{
		cout<<"NO";
	}
	return 0;
}
  1. x等于k也是满足函数条件,意味x是M的元素,因为k本身是M的元素
int x,k;
int search(int y){ //主函数k的值传到y
	if(y==x){
		return true;
	} 

当x<k是 不会满足2k+1和3k+1 的条件。

if(y>x){
		return false;
	}

当x>k是 调用下函数是否满足2k+1和3k+1 的条件。

	if(x>y){
		return search(2*y+1) || search(3*y+1);
	}

完整代码:

#include<bits/stdc++.h>
using namespace std;
int x,k;
int search(int y){
	if(y==x){
		return true;
	} 
	if(y>x){
		return false;
	}
	if(x>y){
		return search(2*y+1) || search(3*y+1);
	}
}
int main(){
//	cin>>k>>x;
	scanf("%d,%d",&k,&x);
	if(search(k)){
		cout<<"YES";
	}
	else{
		cout<<"NO";
	}
	return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

进程优先级、切换、调度

进程的特性是动态&#xff0c;并发&#xff0c;独立&#xff0c;异步&#xff0c;我们今天来浅显的从并发入手介绍各种知识 系统进程数目众多&#xff0c;而CPU资源只有少量&#xff0c;甚至1个&#xff0c;所以进程之间是具有竞争属性的。 为了高效完成任务&#xff0c;更合理…

利用Excel支持JUnit参数化测试

在JUnit里面&#xff0c;可以使用CsvFileSource读取csv文件进行参数化测试&#xff0c;可是CSV文件不支持格式&#xff0c;编辑颇为麻烦&#xff0c;尤其是多次编辑&#xff0c;因此自然想到是否可以使用Excel文件&#xff0c;可以有各种格式&#xff0c;支持各类数据。 最新开…

mysql/java/springboot/javaweb请假系统,分为学生/辅导员/超级管理员

源码下载地址 支持&#xff1a;远程部署/安装/调试、讲解、二次开发/修改/定制 系统分为 学生/辅导员/超级管理员 学生 辅导员 超级管理员

gulp自动化构建

什么是Gulp? Gulp是一种前端开发过程中广泛使用的自动化构建工具&#xff0c;它是基于Node.js构建的&#xff0c;能够极大地提高开发效率和代码质量。Gulp的主要功能包括文件的压缩、合并、重命名等&#xff0c;同时它也支持文件监听和浏览器自动刷新等功能。使用Gulp&#x…

hdlbits系列verilog解答(模块)-20

文章目录 一、问题描述二、verilog源码三、仿真结果 一、问题描述 到目前为止&#xff0c;您已经熟悉了 module模块 &#xff0c;这是一种通过输入和输出端口与其外部交互的电路。更大、更复杂的电路是通过将较小的模块和其他连接在一起的部分&#xff08;例如赋值语句和alway…

基于web的音乐网站播放器,类似网易云

源码下载地址 支持&#xff1a;远程部署/安装/调试、讲解、二次开发/修改/定制 随着互联网技术的不断发展&#xff0c;音乐流媒体服务得到了广泛的普及。用户可以通过在线音乐网站、音乐APP等渠道随时随地收听和分享自己喜欢的音乐。因此&#xff0c;开发一个高效、稳定、易用…

高等数学教材重难点题型总结(五)定积分

总的来说&#xff0c;只要不定积分掌握得好&#xff0c;基础的定积分肯定没问题&#xff1b;对于考研的话&#xff0c;在定积分定义、牛莱公式、反常积分、审敛法的理解要求更高一些&#xff08;数一还会涉及到伽马函数~&#xff09; 1.利用定义计算定积分 2.定积分的近似计算 …

CentOS 编译安装 nginx

CentOS 编译安装 nginx 修改 yum 源地址为 阿里云 curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repoyum makecache升级内核和软件 yum -y update安装常用软件和依赖 yum -y install gcc gcc-c make cmake zlib zlib-devel openss…

C++之#pragma once实例总结(二百四十七)

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

uniapp-微信授权登录

对于制作这个demo的时候是可以使用的&#xff0c;如果不能使用勿喷&#xff0c;如有问题评论区讨论&#xff0c;谢谢大家&#xff01; 目录 ​编辑 前言 完整代码以及注释、使用方法 用法 解析 前言 在移动应用开发中&#xff0c;提供第三方登录是一种常见的用户认证方式…

Android Studio Logcat日志VIVO手机显示*号问题

咨询VIVO客服 1、拨盘输入 *#06# 获取串码&#xff0c;发送给客服 2、拨号盘输入*#*#112#*#*-右上角菜单-更多-一键授权 注意不要刷机&#xff0c;恢复出厂设置&#xff0c;手动取消授权哦

【数据结构】数组和字符串(五):特殊矩阵的压缩存储:稀疏矩阵——压缩稀疏行(CSR)

文章目录 4.2.1 矩阵的数组表示4.2.2 特殊矩阵的压缩存储a. 对角矩阵的压缩存储b~c. 三角、对称矩阵的压缩存储d. 稀疏矩阵的压缩存储——三元组表e. 压缩稀疏行&#xff08;Compressed Sparse Row&#xff0c;CSR&#xff09;矩阵结构体创建CSR矩阵元素设置初始化打印矩阵销毁…

位图算法经典剖析(未完)

第一题 只出现一次的数字|| 给你一个整数数组 nums &#xff0c;除某个元素仅出现 一次 外&#xff0c;其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 class Solution { publ…

35二叉树-树的最小深度

目录 LeetCode之路——111. 二叉树的最小深度 分析 解法一&#xff1a;广度优先查询 解法二&#xff1a;深度优先查询 LeetCode之路——111. 二叉树的最小深度 给定一个二叉树&#xff0c;找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说…

基于STM32与ESP8266的太空人WiFi天气时钟(代码开源)

前言&#xff1a;本文为手把手教学ESP8266著名开源项目——太空人WiFi天气时钟&#xff0c;不同的是本次项目采用的是STM32作为MCU。两者开发过程中有因为各自芯片的特点&#xff08;时钟频率&#xff0c;内存大小等&#xff09;&#xff0c;导致开发程序大不相同&#xff0c;很…

Redis 持久化配置,RDB和AOF方式配置说明

文章目录 一、概述二、RDB 持久化方式配置三、AOF 持久化方式配置 如果您对Redis的了解不够深入请关注本栏目&#xff0c;本栏目包括Redis安装&#xff0c;Redis配置文件说明&#xff0c;Redis命令和数据类型说明。 一、概述 Redis 持久化是指将 Redis 数据存储到磁盘上&#x…

KVM实验之动态迁移

前言 一台NFS&#xff08;192.168.184.132&#xff09; 一台KVM-a&#xff08;192.168.184.133&#xff09; 一台KVM-b&#xff08;192.168.184.134&#xff09; NFS配置&#xff1a; [rootlocalhost ~]# setenforce 0 //关闭selinux [rootlocalhost ~]# service iptables st…

python re 匹配所有字段名称相同的值

import retext {"code": 200,"message": "success","traceId": "da0b668c-4d67-44bf-907f-c072fc63839a","data": {"list": [{"articleId": 121862102,"title": "python 目录…

k8s 金丝雀发布与声明式管理

Deployment控制器支持自定义控制更新过程中的滚动节奏&#xff0c;如“暂停(pause)”或“继续(resume)”更新操作。比如等待第一批新的Pod资源创建完成后立即暂停更新过程&#xff0c;此时&#xff0c;仅存在一部分新版本的应用&#xff0c;主体部分还是旧的版本。然后&#xf…

用图说话——流程图进阶

目录 一、基本流程图 二、时序流程图 一、基本流程图 经常阅读歪果仁绘制的流程图&#xff0c;感觉比较规范&#xff0c;自己在工作中也尝试用他们思维来绘图&#xff0c;这是一个小栗子&#xff1a; 二、时序流程图 在进行Detail设计过程中&#xff0c;一般的绘图软件显得…