首页 > 其他分享 >C语言-详细讲解-洛谷P1255 数楼梯

C语言-详细讲解-洛谷P1255 数楼梯

时间:2024-10-25 19:21:39浏览次数:9  
标签:P1255 洛谷 走法 int 零位 len C语言 题目 楼梯

目录

1.题目要求

2.题目解读 

1.如何计算走法数?

2.如何解决大数加法,防止数据溢出

1.进位的处理

2.正序运算,倒序输出

3.寻找结果中最高的非零位

3.代码实现


1.题目要求

2.题目解读 

一道非常经典的题目,简洁易懂,但需要一定的数学思维,难点如下:

1.如何计算走法数?

这里需要我们运用数学思维,采用倒推法,每一次上楼梯可以走一步或两步,那么走n阶楼梯的走法数就等于(n-1)阶走法数与(n-2)阶走法数的和,只要想通这个问题就可以写出大致的代码框架啦~

2.如何解决大数加法,防止数据溢出

不知道大家有没有关注到题目的Hint

 

“对于100%的数据,1<=n<=5000” 

经过刚刚的思考我们得知走n阶楼梯的走法数就等于(n-1)阶走法数与(n-2)阶走法数的和,那么如果n=5000,结果将会是......

显然这么大的数据就算是long long类型也无法储存,这时就会发生数据溢出,那我们该如何解决呢?

我在这里使用了高精度算法的思想,用二维数组模拟大数加法。(ps:感谢学长的指点~)

高精度算法:它是处理大数字的数学计算方法,在一般的科学计算中,会经常算到小数点后几百位或者更多,当然也可能是几千亿几百亿的大数字。一般这类数字我们统称为高精度数,高精度算法是用计算机对于超大数据的一种模拟加,减,乘,除等运算。

思路:将这种大数字的每一位分别拆开,把每一位取出,存入数组中 ,变成用一个数组去存储每位的数字,最后再将数组进行相应的四则运算。 

ps:这里要特别注意几个小点:(见代码注释)

1.进位的处理

2.正序运算,倒序输出

3.寻找结果中最高的非零位

3.代码实现

#include <stdio.h>
const int N=5001;
int a[5001][5001];//a[n][len]表示上n阶楼梯的走法数结果的第len位数字

void count(int n)
{
	a[1][1]=1;
	a[2][1]=2;//分别表示上 1 阶楼梯有 1 种走法,上 2 阶楼梯有 2 种走法
	for(int i=3;i<=n;i++)
	{
		for(int j=1;j<=N;j++)
		{
			a[i][j]=a[i-2][j]+a[i-1][j];//上第i阶楼梯的走法数等于上i - 2阶和i - 1阶楼梯走法数之和
		}
		for(int j=1;j<=N;j++)//这个内层循环再次遍历每一位,用于处理进位
		{
     		if(a[i][j]>=10)//进位操作
     		{
         		a[i][j+1]+=a[i][j]/10;
         		a[i][j]=a[i][j]%10;
    		}
		}
	}
}

int main()
{
	int n;
	scanf("%d",&n);
	count(n);
	int len=N;
	while(len>=1&&a[n][len]==0) len--;//找到结果中最高的非零位,确定结果的有效位数范围
	for(int i=len;i>=1;i--) printf("%d",a[n][i]);
	return 0;
}

***新手博主创作不易,希望大家多多点赞关注呀~

标签:P1255,洛谷,走法,int,零位,len,C语言,题目,楼梯
From: https://blog.csdn.net/2402_86955314/article/details/143241460

相关文章

  • 【C语言】编译和链接(编译环境和运行环境)
    文章目录一、翻译环境和运行环境二、翻译环境1.编译预处理编译汇编2.链接四、运行环境一、翻译环境和运行环境  在ANSIC的任何⼀种实现中,存在两个不同的环境,如下:翻译环境:在翻译环境中,会通过编译和链接两个大步骤,其中编译又分为了预处理(预编译)、编译和汇......
  • 【C语言】扫雷详解(手把手教你敲扫雷)
    目录前言正文开始1.扫雷游戏的分析与设计1.1扫雷游戏的功能说明1.2游戏的分析和设计1.2.1数据结构的分析1.2.2文件结构设计2.代码实现2.1.1文件game.h2.1.2文件game.c2.1.3文件test.c2.2讲解2.2.1主体2.2.2有关定义2.2.3函数1.InitBoard()初始化棋盘2.SetMin......
  • 如何在C语言中进行数据加密
    ##如何在C语言中进行数据加密在讨论C语言中的数据加密时,我们首先需要明确两个核心观点:使用加密库、实现自定义加密算法。其中,使用加密库是最直接且高效的方式,因为这允许开发者利用已经广泛测试和验证的加密算法来保护数据的安全性,而无需深入了解加密算法的内部工作原理。此外,一......
  • 为什么c语言不支持热更新
    ###为什么C语言不支持热更新在讨论为什么C语言不支持热更新时,我们首先需要明确几个核心观点:C语言的编译性质、内存管理机制、以及与操作系统的底层交互方式。编译性质意味着C语言代码在运行前需要被完全编译成机器码,这个过程中产生的是一个静态的、不可变的执行文件。这与热更......
  • 数据结构图的最短路径-弗洛伊德算法(有向图+数据结构课本C++代码一比一转C语言+邻接矩
    弗洛伊德算法有向图代码如下:#define_CRT_SECURE_NO_WARNINGS1#include<stdio.h>#include<stdlib.h>#include<limits.h>#defineMaxInt32767#defineMVNum100intPath[MVNum][MVNum];//存放前驱索引的intD[MVNum][MVNum];//存放当前已知的权值//图的邻接......
  • 实验三 C语言函数应用编程
    一、实验目的 能正确使用C语法规则定义,声明,调用函数能正确编写递归函数针对具体问题场景,合理抽象出独立的功能模块,正确定义函数并使用,使得代码更具可读性,可维护性针对具体问题场景,能正确,合理使用全局变量和局部static变量,解决实际问题二、实验准备 1,函数定义,声明,调用的语......
  • 数据结构 ——— C语言实现链式队列
    目录队列的概念以及示意图数组队列和链式队列链式队列的结构 实现链式队列的准备工作实现链式队列1.初始化2.打印队列的所有数据3.数据入队列(尾插)4.数据出队列(头删)5.访问队头的数据6.访问队尾的数据7.队列数据总个数8.判断队列是否为空9.释放队列的所......
  • 数据结构 ——— C语言实现数组栈
    目录栈的概念以及示意图链式栈和数组栈链式栈:数组栈:数组栈的结构实现数组栈的准备工作实现数组栈初始化数组栈入栈(尾插)出栈(尾删)访问栈顶数据判断栈是否为空栈数据的总数访问栈的所有数据释放栈Stack.h的所有代码Stack.c的所有代码栈的概念以及示意图栈......
  • C语言中的作用域规则
    文章的开头段落:在C语言中,作用域规则是一个非常重要的部分,主要涉及变量和函数的可见性和生命周期。根据作用域的界限,可将C语言的作用域分为四种:文件作用域、函数作用域、块作用域和函数原型作用域。它们分别规定了变量或函数在程序中的可见区域和生存期长度。每种作用域各有其特......
  • 编程语言有哪些分类?C语言和其他编程语言的区别?到底什么是高级语言,什么是低级语言?C
    编程语言有哪些分类?编程语言发展有打孔卡片、机器语言、汇编语言和高级语言这几种形态。高级语言对于程序员更友好,发展的形态五花八门。从编程方式看,有命令式、函数式和逻辑式三种。命令式以常见的C/C++/Java/C#/Py......