首页 > 编程语言 >递归算法练习C++

递归算法练习C++

时间:2023-08-10 17:36:54浏览次数:44  
标签:输出 return 递归 int C++ 算法 fun include 表达式

1、逆波兰表达式
(1)题目描述

逆波兰表达式是一种把运算符前置的算术表达式,例如普通的表达式2 + 3的逆波兰表示法为+ 2 3。逆波兰表达式的优点是运算符之间不必有优先级关系,也不必用括号改变运算次序,例如(2 + 3) * 4的逆波兰表示法为* + 2 3 4。本题求解逆波兰表达式的值,其中运算符包括+ - * /四个。

【输入】 输入为一行,其中运算符和运算数之间都用空格分隔,运算数是浮点数。

【输出】 输出为一行,表达式的值。

可直接用printf("%f\n", v)输出表达式的值v。

【输入样例】

* + 11.0 12.0 + 24.0 35.0

【输出样例】 1357.000000

(2)AC代码

使用char类型的数组存储字符串,就可以使用 atof()函数将字符串转换为浮点数

#include<iostream>
#include<set>
#include<vector>
#include<cmath>
#include<algorithm>
#include<map>
#include<string>
#include<cstring>
using namespace std;

char str[105];
double res;
double fun()
{
	scanf("%s",str);
	switch(str[0])
	{
		case '+':
			res= fun()+fun();
			break;
		case '-':
			res= fun()-fun();
			break;
		case '*':
			res= fun()*fun();
			break;
		case '/':
			res= fun()/fun();
			break;
		default:
			res= atof(str);
	}
	return res;
}
int main()
{
	printf("%f\n",fun());
	
    return 0;
}
2、全排列
(1)题目描述

给定一个由不同的小写字母组成的字符串,输出这个字符串的所有全排列。

我们假设对于小写字母有‘a’ <‘b’ < ... <‘y’<‘z’,而且给定的字符串中的字母已经按照从小到大的顺序排列。

【输入】 只有一行,是一个由不同的小写字母组成的字符串,已知字符串的长度在1到6之间。

【输出】 输出这个字符串的所有排列方式,每行一个排列。要求字母序比较小的排列在前面。字母序如下定义:

已知S=s1s2...sk,T=t1t2...tk ,则S<T等价于,存在p(1<=p<=k),使得s1=t1,s2=t2,...,sp−1=tp−1,sp<tp 成立。

【输入样例】 abc 【输出样例】 abc acb bac bca cab cba

(2)AC代码

直接使用STL的内置函数:next_permutation(),生成全排列

#include<iostream>
#include<set>
#include<vector>
#include<cmath>
#include<algorithm>
#include<map>
#include<string>
#include<cstring>
using namespace std;
typedef long long ll;
const int N=100005;


int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cin.tie(0);
	
	string s;
	getline(cin,s);
	
	do{
		cout<<s<<endl;
	}while(next_permutation(s.begin(),s.end()));
	
    return 0;
}

使用dfs搜索

#include<iostream>
#include<string>
#include<cstring>
using namespace std;

string s;
bool vis[7];
void dfs(int index,int len,string res)
{
	if(index==len)
	{
		cout<<res<<endl;
		return;
	}
	for(int i=0;i<len;i++)
	{
		if(!vis[i])
		{
			vis[i]=true;
			dfs(index+1,len,res+s[i]);
			vis[i]=false;
		}
	}
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cin.tie(0);
	
	
	getline(cin,s);
	int len= s.length();
	dfs(0,len,"");
	
    return 0;
}
3、最大公约数
(1)题目描述

给定两个正整数,求它们的最大公约数。

【输入】 输入一行,包含两个正整数(<1,000,000,000)。

【输出】 输出一个正整数,即这两个正整数的最大公约数。

【输入样例】 6 9 【输出样例】 3

(2)AC代码

使用 long long 没有必要,但是本人有这个习惯。。

#include<iostream>
#include<string>
#include<cstring>
using namespace std;
typedef long long ll;

ll a,b;
ll fun(ll x,ll y)
{
	if(y==0)return x;
	else return fun(y,x%y);
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cin.tie(0);
	
	
	cin>>a>>b;
	cout<<fun(a,b);
	
    return 0;
}
4、因子分解
(1)题目描述

输入一个数,输出其素因子分解表达式。

【输入】 输入一个整数 n (2≤n<100)。

【输出】 输出该整数的因子分解表达式。

表达式中各个素数从小到大排列。

如果该整数可以分解出因子a的b次方,当b大于1时,写做 a^b ;当b等于1时,则直接写成a。 【输入样例】 60 【输出样例】 2^235

(2)AC代码

方法一,使用vector+数组,但是适用于n的范围确定且n较小的情况,本题可以通过。

#include<iostream>
#include<cmath>
#include<algorithm>
#include<vector>
using namespace std;
vector<int>v;
int a[100]={0};
// 判断素数
bool prime(int n)
{
	int t=(int)sqrt(n);
	if(n==1)return false;
	if(n==2||n==3)return true;
	for(int i=2;i<=t;i++)
	{
		if(n%i==0)return false;
	}
	return true;
}
// 分解
void fun(int n)
{
	int t=(int)sqrt(n); // 只需要枚举到根号n
	for(int i=2;i<=t;i++)
	{
		if(n%i==0)
		{
			if(prime(i))
			{
				v.push_back(i); // 是素数就加入
			}
			if(prime(n/i))
			{
				v.push_back(n/i);// 判断另一个是不是素数
			}else
			{
				fun(n/i);// 另一个不是素数,递归判断 n/i
				break;// 要终止此次n的判断
			}
		}
	}
}
int main()
{
	int n;
	cin>>n;
	fun(n);
	sort(v.begin(),v.end());
	
	for(unsigned i=0;i<v.size();i++)
	{
		a[v[i]]++;// 求每个因数的个数,利用桶排序思想
	}
	bool flag=true;
	for(int i=0;i<100;i++)
	{
		if(a[i]!=0)
		{
			if(!flag)cout<<"*";// 第一个输出前不加 *
			if(a[i]>1)
			{
				cout<<i<<"^"<<a[i];
				flag=false;
			}else
			{
				cout<<i;
				flag=false;
			}
		}
	}
	return 0;
}

方法二,使用STL的map,直接统计,且不受n的大小制约

#include<iostream>
#include<set>
#include<vector>
#include<cmath>
#include<algorithm>
#include<map>
#include<string>
#include<cstring>
using namespace std;

int n;
map<int,int> m;
bool prime(int x)
{
	if(x==1||x==0)return false;
	if(x==2||x==3)return true;
	int t=(int)sqrt(x);
	for(int i=2;i<=t;i++)
	{
		if(x%i ==0)return false;
	}
	return true;
}
void fun(int x)
{
	int t=(int)sqrt(x);// 必须是根号x,不能是x/2,否则会重复判断
	for(int i=2;i<=t;i++)
	{
		if(x%i==0)
		{
			if(prime(i))
			{
				m[i]++;	
			}
			if(prime(x/i))
				m[x/i]++;
			else{
				fun(x/i);
				break;
			}
		}
	}
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cin.tie(0);
	
	
	cin>>n;
	if(prime(n))
	{
		cout<<n;
		return 0;
	}
	fun(n);
	map<int,int>::iterator it=m.begin();
	if(it->second > 1)
	{
		cout<<it->first<<"^"<<it->second;
	}else{
		cout<<it->first;
	}
	it++;
	for(;it!=m.end();it++)
	{
		if(it->second > 1)
		{
			cout<<"*"<<it->first<<"^"<<it->second;
		}else{
			cout<<"*"<<it->first;
		}
	}
    return 0;
}

标签:输出,return,递归,int,C++,算法,fun,include,表达式
From: https://blog.51cto.com/u_16200950/7037817

相关文章

  • Google C++ 风格指南记录
    最近在看谷歌的C++风格指南发现了一些有意思的知识点,遂记录下1.第六章第二小节介绍了右值引用只在定义移动构造函数与移动赋值操作时使用右值引用.不要使用 std::forward.定义:右值引用是一种只能绑定到临时对象的引用的一种,其语法与传统的引用语法相似.例如, void......
  • Lnton羚通智能分析算法检测人群异常聚集检测告警算法的流程代码
    Lnton羚通视频智能分析算法中人群异常聚集检测报警系统是基于yolov8图像识别和数据分析技术,人群异常聚集检测告警算法通过在关键区域布设监控摄像头,实时监测人员的密集程度和行为动态,分析和判断人群密集程度是否超过预设阈值,一旦发现异常聚集,将自动发出信号,并提示相关人员采取相应......
  • AI绘画教程:为艺术而生的算法,你还在烦恼小红书与公众号的配图吗?(下)
    大家好,我是千寻哥,在上一篇给大家分享了我的第一篇AI绘画类教程的上集:AI绘画教程:为艺术而生的算法,你还在烦恼小红书与公众号的配图吗(上)?别着急,今天就来完成下半部分,在上一集中,我们介绍了三种用于生成AI绘画的网站。使用网站生成的AI绘画图片用于小红书的封面以及素材,从而助力你的新媒......
  • 有效的括号--LeetCode算法
    不用map的解法publicbooleanisValid(Strings){//输入的字符串为空,直接返回trueif(s.isEmpty())returntrue;//新建一个栈Stack<Character>stack=newStack<Character>();//遍历传入的字符串//如果时"(","{","["就......
  • 算法——初级排序算法之希尔排序
    介绍&特点对于大规模乱序数组插入排序很慢,因为它只会交换相邻的元素,元素只会一点一点地从数组一端移到另一端。例如,如果主键最小的元素正好在数组的尽头,要将它挪到正确的位置就需要N-1次移到。希尔排序为了加快速度简单地改进了插入排序,交换不相邻的元素以对数组的局部进行排序,并......
  • 代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素
    704二分查找题目给定一个n个元素有序的(升序)整型数组nums和一个目标值target,写一个函数搜索nums中的target,如果目标值存在返回下标,否则返回-1。第一想法判断条件是value=target因为数组是升序,其实每种查找方法应该相差不大?不过题目都标了二分查找了emmm思......
  • 【通知】有三AI更新420页14万字视觉算法工程师成长指导手册,可下载收藏打印...
    各位同学,可还记得我们发布的《深度学习视觉算法工程师成长指导手册》,现在更新了,超过14万字,420页文档,可下载收藏打印,目录如下,文末提供了下载方式。手册简介目前深度学习在图像,语音,NLP领域大展拳脚,不管是本专业还是非本专业的技术人员都有很多人投身这一行,但是学校的学科建设刚刚开始......
  • manacher(马拉车)算法C++详解
    马拉车的定义马拉车本质是对中心扩展法(暴力算法)的优化。马拉车是干什么的Manacher算法帮助我们在给定的字符串中找到最长的回文子串。为了简单起见,我们先只处理有奇数个字符的字符串,关于偶数个字符的字符串,在文章最后会给出解法。我们的处理思路和暴力算法基本一致,那就是从左......
  • C/C++基础知识点
    C和C++的区别C++是C的超集,C是面向过程化的结构性语言,而C++是面向对象的编程语言C语言更偏向于底层,使用较为灵活,可移植性强,而C++更偏向于上层,可扩展性强,对于大型项目往往使用C++C++在C语言的基础上提出了STL标准模板库,函数模板等特性static关键字的作用隐藏,凡事变量前添加s......
  • 单源次短路算法 学习笔记
    次短路:顾名思义就是一张图中第二短的路径。分类:1.边不可重复经过的次短路问题。边可重复经过的次短路问题。2.严格次短路(次短路长度必须大于最短路长度)。非严格次短路(次短路长度可以大于或等于最短路长度)。一、边不可重复经过的次短路问题例题:LuoguP1491集合位置题目分析......