-27-(剑指offer中的汉诺塔,青蛙跳台阶)

斐波那契数列:

int Fib(int n)
{
	int a = 1;
	int b = 1;
	int c = 1;//在这里最好给1或0
	while (n > 2)//这里大于2,其实就是从第三个开始加
	{
		c = a + b;
		a = b;
		b = c;
		n--;
	}
	return c;
	if (n <= 2)
		return 1;
}
int main()
{
	int n;
	int ret = 0;
	scanf("%d", &n);
	ret = Fib(n);
	printf("%d", ret);
	return 0;
}

C语言解决汉诺塔问题:

void hanoi(int n, char source, char auxiliary, char target);

int main() {
	int n;

	// 获取用户输入的盘子数量
	printf("请输入汉诺塔的盘子数量:");
	scanf("%d", &n);

	// 调用汉诺塔函数
	hanoi(n, 'A', 'B', 'C');

	return 0;
}

// 汉诺塔递归函数
void hanoi(int n, char source, char auxiliary, char target) 
{
	if (n == 1) 
    {
		// 只有一个盘子时,直接移动到目标柱子
		printf("将第%d个盘子从 %c 移动到 %c\n",n, source, target);
	}
	else 
   {
		// 将 n-1 个盘子从 source 移动到 auxiliary
		hanoi(n - 1, source, target, auxiliary);
		// 将剩下的一个盘子从 source 移动到 target
		printf("将第%d个盘子从 %c 移动到 %c\n",n, source, target);
		// 将 n-1 个盘子从 auxiliary 移动到 target
		hanoi(n - 1, auxiliary, source, target);
	}
}

C语言解决青蛙跳台阶的问题:

unsigned long long jumpStairs(unsigned int n);

int main() {
	unsigned int n;

	// 获取用户输入的台阶数
	printf("请输入台阶的数量:");
	scanf("%u", &n);

	// 计算青蛙跳上n阶台阶的总跳法数
	unsigned long long ways = jumpStairs(n);

	// 输出结果
	printf("青蛙跳上%u阶台阶的总跳法数为:%llu\n", n, ways);

	return 0;
}

// 动态规划解决青蛙跳台阶问题
unsigned long long jumpStairs(unsigned int n) {
	// 基本情况
	if (n == 1) return 1;
	if (n == 2) return 2;

	// 初始化前两个台阶的跳法数
	unsigned long long dp[n + 1];
	dp[1] = 1;
	dp[2] = 2;

	// 动态规划计算
	for (unsigned int i = 3; i <= n; ++i) {
		dp[i] = dp[i - 1] + dp[i - 2];
	}

	// 返回第n个台阶的跳法数
	return dp[n];
}

此时的n会报错,原因是变量不能直接用来声明数组的大小。可以用指针或动态分配内存的方式来创建一个大的数组。

unsigned long long jumpStairs(unsigned int n);

int main() 
{
	unsigned int n;

	// 获取用户输入的台阶数
	printf("请输入台阶的数量:");
	scanf("%u", &n);

	// 计算青蛙跳上n阶台阶的总跳法数
	unsigned long long ways = jumpStairs(n);

	// 输出结果
	printf("青蛙跳上%u阶台阶的总跳法数为:%llu\n", n, ways);
	return 0;
}
// 动态规划解决青蛙跳台阶问题
unsigned long long jumpStairs(unsigned int n) 
{
	// 动态分配数组空间
	unsigned long long* dp = (unsigned long long*)malloc((n + 1) * sizeof(unsigned long long));
	// 基本情况
	dp[0] = 1;
	dp[1] = 1;
	dp[2] = 2;

	// 动态规划计算
	for (unsigned int i = 3; i <= n; ++i) 
	{
		dp[i] = dp[i - 1] + dp[i - 2];
	}

	// 返回第n个台阶的跳法数,并释放内存
	unsigned long long result = dp[n];
	free(dp);
	return result;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值