【归纳】常见函数模版和解析2(含进制转换详细代码)

1.计算阶乘

    阶乘的定义:阶乘符号为!,即 n ! = 1 × 2 × 3 × . . . × ( n − 1 ) × n 。 n!=1×2×3×...×(n-1)×n。 n!=1×2×3×...×(n1)×n也可以递归地定义为 0 ! = 1 , n ! = ( n − 1 ) ! × n 。 0!=1,n!=(n-1)!×n。 0!=1n!=(n1)!×n

递归边界: 0 ! = 1 0!=1 0!=1

//计算n!
long long f(const int& n) {//阶乘可能很大所以要开long long
    if (n == 0)return 1;
    else return n * f(n - 1);
}

2.斐波那契数列

    在数学上,斐波那契数列以如下递推的方法定义: F ( 1 ) = 1 , F ( 2 ) = 1 , F ( n ) = F ( n − 1 ) + F ( n − 2 ) F(1)=1,F(2)=1, F(n)=F(n - 1)+F(n - 2) F(1)=1F(2)=1,F(n)=F(n1)+F(n2)

递归边界: F ( 1 ) = 1 , F ( 2 ) = 1 F(1)=1,F(2)=1 F(1)=1F(2)=1

    一个经典的斐波那契数列如下:

1、 1、 2、 3、 5、 8、 13、 21、 34、 55…

//计算斐波那契数列的第n项
long long fib(const int& n) {//斐波那契数列计算到后面可能很大,所以要开long long
    if (n == 1 || n == 2)return 1;
    else return fib(n - 1) + fib(n - 2);
}

3.进制转换

3.1.十进制转n进制

    将一个十进制数转n进制数,可以使用短除法。示例如下:
在这里插入图片描述
    如果看不懂可以自己上网查询。

3.1.1.迭代法

要实现这一功能,根据短除法模拟就行了。

前置函数:

string reverse(const string& str) {//将字符串反转的函数 
	string ans;
	for (int i = str.length() - 1; i >= 0; i--)
		ans += str[i];
	return ans;
}

关键代码:

//如果会使用栈可以尝试用栈来编写代码,会更容易一些。
string binary_num = "0123456789ABCDEF";

//将十进制数转换成n进制数的函数
string ten_to_n_binary(int num, const int& n) {
	string ans;
	while (num){//没有取完就一直取
		ans += binary_num[num % n];
		num /= n;
	}
	ans = reverse(ans);//最后要反转一次
	return ans;
}

3.1.2.递归法

个人觉得递归法比较复杂,所以一般只需要掌握迭代法就行

递归边界:商为 0 0 0时返回。

前置函数:

string reverse(const string& str) {//将字符串反转的函数 
	string ans;
	for (int i = str.length() - 1; i >= 0; i--)
		ans += str[i];
	return ans;
}

string int_to_string(int num) {//将数字转换成字符串的函数 
	string ans;
	while (num) {
		ans += num % 10 + '0';
		num /= 10;
	}
	reverse(ans);//记得最后要翻转一次 
	return ans;
}

关键代码(递归法):

//binary_num[i]代表数字i代表的数字或字母,这里最多支持16进制,可以自己尝试修改
string binary_num = "0123456789ABCDEF";

//将十进制数num转换成n进制数
string __ten_to_n_binary(const int& num, const int& n) {
	string ans;//存储答案
	if (num / n == 0)ans = int_to_string(num);//递归边界
	else ans = binary_num[num % n] + __ten_to_n_binary(num / n, n);//递归处理
	return ans;
}

//翻转,这才是可以使用的函数
string ten_to_n_binary(const int& num, const int& n) {
    return reverse(__ten_to_n_binary(num, n));
}

3.2.n进制转十进制

    将一个n进制数转十进制数,可以使用位权展开法,示例如下:

将 ( 120 ) 8 转换为十进制 ( 120 ) 8 = 1 ∗ 8 2 + 2 ∗ 8 1 + 0 ∗ 8 0 = 80 将(120)_8转换为十进制 (120)_8=1*{8^2} +{2*8^1} +0*8^0 =80 (120)8转换为十进制(120)8=182+281+080=80

    当然,小数也可以用类似的方法展开,这里不做详细介绍, 有兴趣的可以自己上网查询。

    可以自己尝试使用递归法,这里只提供迭代法实现这一功能。

前置函数:

int match(const char& tmp) {//配对字符或数字对应的数字 
	if (tmp >= '0' && tmp <= '9')return tmp - '0';
	else return tmp - 'A' + 10;
}

关键代码:

//将n进制数num转换成十进制数的函数
int n_to_ten_binary(const string& num, const int& n) {
	int ans;
	for (int i = 0; i < num.length(); i++)//循环每一位 
		ans += pow(n, num.length() - i - 1) * match(num[i]);//展开 
	return ans;
}

3.3.a进制转b进制

    可以通过中间媒介的方式来进行转换。先将a进制数转换成十进制,再将十进制数转换成b进制数。代码整合如下:

3.4.代码整合

#include<bits/stdc++.h>//万能头文件
using namespace std;
//前置函数
string reverse(const string& str);//将字符串反转的函数
int match(const char& tmp);//配对字符或数字对应的数字

//关键代码
string binary_num = "0123456789ABCDEF";

//将十进制数转换成n进制数的函数
string ten_to_n_binary(int num, const int& n) {
	string ans;
	while (num){//没有取完就一直取
		ans += binary_num[num % n];
		num /= n;
	}
	ans = reverse(ans);//最后要反转一次
	return ans;
}

//将n进制数num转换成十进制数的函数
int n_to_ten_binary(const string& num, const int& n) {
	int ans;
	for (int i = 0; i < num.length(); i++)//循环每一位 
		ans += pow(n, num.length() - i - 1) * match(num[i]);//展开 
	return ans;
}

//将a进制数转换成b进制数的函数
string decimal_conversion(const string& num, const int& a, const int& b) {
	int num_ten_binary = n_to_ten_binary(num, a);
	return ten_to_n_binary(num_ten_binary, b);
}

int main(){
	int opt;
	cout << "请输入你想进行的操作(输入-1代表结束):" << endl;
	//测试 
	while (true){
		cin >> opt;
		if (opt == -1)break;
		switch (opt){
		case 1:{
			int num, n;
			cout << "请输入要转换的十进制数和要转换成的进制数:" << endl;
			cin >> num >> n;
			cout << ten_to_n_binary(num, n);
			break;
		}
		case 2:{
			string num;
			int n;
			cout << "请输入要转换的n进制数和进制数:" << endl;
			cin >> num >> n;
			cout << n_to_ten_binary(num, n);
			break;
		}
		case 3:{
			string num;
			int a, b;
			cout << "请输入要转换的n进制数和两个进制数:" << endl;
			cin >> num >> a >> b;
			cout << decimal_conversion(num, a, b);
			break;
		}
		}
	}
	return 0;
}

string reverse(const string& str) {//将字符串反转的函数 
	string ans;
	for (int i = str.length() - 1; i >= 0; i--)
		ans += str[i];
	return ans;
}

int match(const char& tmp) {//配对字符或数字对应的数字 
	if (tmp >= '0' && tmp <= '9')return tmp - '0';
	else return tmp - 'A' + 10;
}

注:本人新手一枚,如果有错误请各位大佬指出,感谢你宝贵的意见。

喜欢就订阅此专辑吧!

【蓝胖子编程教育简介】
蓝胖子编程教育,是一家面向青少年的编程教育平台。平台为全国青少年提供最专业的编程教育服务,包括提供最新最详细的编程相关资讯、最专业的竞赛指导、最合理的课程规划等。本平台利用趣味性和互动性强的教学方式,旨在激发孩子们对编程的兴趣,培养他们的逻辑思维能力和创造力,让孩子们在轻松愉快的氛围中掌握编程知识,为未来科技人才的培养奠定坚实基础。

欢迎扫码关注蓝胖子编程教育
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝胖子教编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值