【归纳】常见函数模版和解析2,含进制转换详细代码
1.计算阶乘
阶乘的定义:阶乘符号为!
,即
n
!
=
1
×
2
×
3
×
.
.
.
×
(
n
−
1
)
×
n
。
n!=1×2×3×...×(n-1)×n。
n!=1×2×3×...×(n−1)×n。也可以递归地定义为
0
!
=
1
,
n
!
=
(
n
−
1
)
!
×
n
。
0!=1,n!=(n-1)!×n。
0!=1,n!=(n−1)!×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)=1,F(2)=1,F(n)=F(n−1)+F(n−2)。
递归边界: F ( 1 ) = 1 , F ( 2 ) = 1 F(1)=1,F(2)=1 F(1)=1,F(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=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(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;
}
注:本人新手一枚,如果有错误请各位大佬指出,感谢你宝贵的意见。
喜欢就订阅此专辑吧!
【蓝胖子编程教育简介】
蓝胖子编程教育,是一家面向青少年的编程教育平台。平台为全国青少年提供最专业的编程教育服务,包括提供最新最详细的编程相关资讯、最专业的竞赛指导、最合理的课程规划等。本平台利用趣味性和互动性强的教学方式,旨在激发孩子们对编程的兴趣,培养他们的逻辑思维能力和创造力,让孩子们在轻松愉快的氛围中掌握编程知识,为未来科技人才的培养奠定坚实基础。
欢迎扫码关注蓝胖子编程教育