C++实现一个数字与字母对应的多少种翻译方法

给定一个数字num—>[0,2^31],设有一个翻译方法,将0与a对应,25与z对应,试问这个数字有多少种翻译方法。
1、Do1运用递归是实现;
2、Do2在递归中加入了unorder_map,来记住中间的重复的步骤;
3、运用递归,状态方程f(n)=f(n-1)+g(x)*f(n-2).

#include<iostream>
using namespace std;
#include<unordered_map>

class Translation_num {
public:
	static int Do1(int num)
	{
		if (num<10 and num>-1)
			return 1;
		int target = num % 100;
		if (target > 9 && target < 26)
		{
			return Do1(num / 10) + Do1(num / 100);
		}
		return Do1(num / 10);
	}
	static int Do2(int num)
	{
		unordered_map<int, int> cache;
		return dfs(num, cache);
	}
	static int Do3(int num)
	{
		if (num<10 && num>-1)
			return 1;
		int len = 1;
		for (int i = num; i > 10; i /= 10)
			len++;
		vector<int> dp(len + 1);
		dp[0] = 1;
		dp[1] = 1;
		for (int i = 2; num > 10;num /= 10, i++)
		{
			int target = num % 100;
			if (target > 9 && target < 26)
				dp[i] = dp[i - 1] + dp[i - 2];
			else
				dp[i] = dp[i - 1];
		}
		return dp[len];
	}
private:
	static int dfs(int num, unordered_map<int, int> cache)
	{
		if (num<10 && num>-1)
			return 1;
		if (cache.find(num) != cache.end())
			return cache[num];
		int target = num % 100;
		if (target > 9 && target < 26)
		{
			cache[num] = dfs(num / 10, cache) + dfs(num / 100, cache);
			return cache[num];
		}
		cache[num] = dfs(num / 10,cache);
		return cache[num];

	}

};

void main()
{
	int num = 12;
	cout << "Do1:" << Translation_num::Do1(num)<<endl;
	cout << "Do2:" << Translation_num::Do2(num) << endl;
	cout << "Do3:" << Translation_num::Do3(num) << endl;
	return;
	system("pause");
}
好的,这里提供一个使用数字和大写字母设计的36进制,并封装成类并提供方法的例子,以及这个类的C++实现: ```python class Base36: def __init__(self): # digits字符串包含了36个字符,分别对应36进制中的每个数字字母 self.digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" def to_base_36(self, num): # 将10进制数字转换为36进制字符串 if num == 0: return "0" result = "" while num > 0: remainder = num % 36 result = self.digits[remainder] + result num //= 36 return result def from_base_36(self, s): # 将36进制字符串转换为10进制数字 result = 0 for i in range(len(s)): digit = self.digits.index(s[i]) power = 36 ** (len(s) - i - 1) result += digit * power return result ``` ```c++ #include <iostream> #include <string> #include <cmath> class Base36 { public: Base36(): digits("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ") {} std::string to_base_36(int num) { // 将10进制数字转换为36进制字符串 if (num == 0) { return "0"; } std::string result = ""; while (num > 0) { int remainder = num % 36; result = digits[remainder] + result; num /= 36; } return result; } int from_base_36(std::string s) { // 将36进制字符串转换为10进制数字 int result = 0; for (int i = 0; i < s.length(); i++) { int digit = digits.find(s[i]); int power = pow(36, s.length() - i - 1); result += digit * power; } return result; } private: std::string digits; }; int main() { // 创建Base36实例,测试10进制与36进制互转功能 Base36 base36; int num = 123456789; std::string base_36 = base36.to_base_36(num); std::cout << "Base 36 of " << num << " is " << base_36 << std::endl; int new_num = base36.from_base_36(base_36); std::cout << "New number from base 36 is " << new_num << std::endl; return 0; } ``` 在这个例子中,36进制采用了数字0-9和大写字母A-Z,因此使用了一个包含了36个字符的字符串来表示这个36进制。在C++实现中,使用了std::string来表示这个字符串。我们可以使用main函数来测试这个类的功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值