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

发布于:2024-08-08 ⋅ 阅读:(128) ⋅ 点赞:(0)

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(const int& num,const int& n)
{
	int num1=num;
	string ans;
	while(num1)//没有取完就一直取
	{
		ans+=binary_num[num1%n];
		num1/=n;
	}
	ans=reverse(ans);//最后要反转一次
	return ans;
}

3.1.2.递归法

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

递归边界:商为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";

//is_first存储是否是第一层代码,将十进制数num转换成n进制数
string ten_to_n_binary(const int& num,const int& n,int is_first=1)
{
	string ans;//存储答案
	if(num/n==0)ans=int_to_string(num);//递归边界
	else ans=binary_num[num%n]+ten_to_n_binary(num/n,n,0);//递归处理
	if(is_first)ans=reverse(ans);//翻转
	return ans;
}

3.2.n进制转十进制

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

将(120)8转换为十进制

(120)8=1*82 +2*81 +0*80 =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(const int& num,const int& n)
{
	int num1=num;
	string ans;
	while(num1)//没有取完就一直取
	{
		ans+=binary_num[num1%n];
		num1/=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;
}

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

喜欢就订阅此专辑吧!

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

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


网站公告

今日签到

点亮在社区的每一天
去签到