储存高精长整型の另一种思路——二维数组

news/2024/10/23 20:29:55/

利用二维数组储存高精长整型

  • 题目
  • 解题思路
  • 问题解决
  • 代码实现
  • 总结反思

题目

luogu P2437 蜜蜂路线
1

解题思路

  最初只觉得是一道很简单的递推

  先考虑从第一个点出发的情况,对于第 k ( k ≥ 3 ) k (k≥3) k(k3)个点,路线数表示如下:
a [ k ] = a [ k − 1 ] + a [ k − 2 ] a[k]=a[k-1]+a[k-2] a[k]=a[k1]+a[k2]  接下来我们开始考虑不从第一个点开始的情况,即从第 m m m个点到第 n n n个点的路线数,可以平替为从第 1 1 1个点到第 n − m + 1 n-m+1 nm+1个点的爬行路线。

  对你想的没错,就是我们熟悉的斐波那契数列,当我最初看到数据范围 n , m ≤ 1000 n,m≤1000 n,m1000 时我不以为意,但上去就WA了,意识到事情不对了。
  我们要意识到,斐波那契的第1000项是这个数字:

43466557686937456435688527675040625802564660517371780402481729089536555417949051890403879840079255169295922593080322634775209689623239873322471161642996440906533187938298969649928516003704476137795166849228875

  不会高精度的我陷入了沉思… …

  还好看到了一位 d a l a o dalao dalao为纯小白准备的解决方案

问题解决

  我们准备一个二维数组 f [ i ] [ j ] f[i][j] f[i][j] ,表示第1个点到第 i i i个点的路线数的第 j j j位的数字是 f [ i ] [ j ] f[i][j] f[i][j]

  对于第 i i i 个点 f [ i ] [ j ] f[i][j] f[i][j] 的计算方式如下:

void ad(int x)
{int i;for(i=1;i<=len;++i) f[x][i]=f[x-1][i]+f[x-2][i];for(i=1;i<=len;++i){if(f[x][i]>9){f[x][i+1]+=f[x][i]/10;f[x][i]%=10;}}if(f[x][len+1]) len++;
}

  逢十进一,通俗易懂

  这样就能让每一个 f [ i ] [ j ] f[i][j] f[i][j]都只储存一位数字,不用害怕超过储存范围的问题。最大的 m a x n u m maxnum maxnum有几位,第二维度开多大即可。

代码实现

#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<string.h>
int m,n,len=1; 
int f[1005][1005];
void ad(int x)
{int i;for(i=1;i<=len;++i) f[x][i]=f[x-1][i]+f[x-2][i];for(i=1;i<=len;++i){if(f[x][i]>9){f[x][i+1]+=f[x][i]/10;f[x][i]%=10;}}if(f[x][len+1]) len++;
}
int main()
{scanf("%d%d",&m,&n);f[1][1]=1; f[2][1]=1;int i;for(i=3;i<=n-m+1;++i)	ad(i);for(i=len;i;i--) printf("%d",f[n-m+1][i]);return 0;
} 

总结反思

1、学到了存储长整型的一种不一样的方式,以后可以多做尝试。
2、高精度的系统学习是时候提上日程了。


http://www.ppmy.cn/news/1114621.html

相关文章

科技抗老新突破,香港美容仪品牌内地重磅上市

近年来&#xff0c;新消费时代“颜值经济”的火热促使美容行业市场规模增长迅速&#xff0c;越来越多的人愿意为“美”买单&#xff0c;对美的需求也随之增长&#xff0c;美容行业已经成为成长最快的新锐产业。随着经济和科技的发展&#xff0c;“快捷”也成为了当今社会的时代…

数据结构与算法(三)——递归

一、递归的概念 递归就是方法自己调用自己&#xff0c;每次调用时传入不同的变量。 递归有助于编程者解决复杂的问题&#xff0c;同时可以让代码变得简洁。 1.1 递归机制 递归调用规则&#xff1a; 1>当程序执行到一个方法时&#xff0c;就会开辟一个独立的空间&#xff0…

Python 数据分析入门教程:Numpy、Pandas、Matplotlib和Scikit-Learn详解

文章目录 Python数据分析入门教程Numpy库Pandas库Matplotlib绘图Scikit-Learn机器学习 NumPy数组与运算NumPy数组对象数组创建函数数组运算数组索引数组操作总结 总结python精品专栏推荐python基础知识&#xff08;0基础入门&#xff09;python爬虫知识 Python数据分析入门教程…

Linux学习之Redis集群部署

Redis集群部署 准备集群环境 创建集群 # 准备集群环境--配置192.168.88.51(host51) [rootlocalhost ~]# yum install -y redis [roothost51 ~]# vim /etc/redis.conf bind 192.168.88.51 cluster-enabled yes cluster-config-file nodes-6379.conf cluster-node-timeout 5000…

现在全国融资融券两融利率最低是多少?哪家证券公司券商费率低?

融资融券是指投资者通过向券商借入资金&#xff08;融资&#xff09;或借入证券&#xff08;融券&#xff09;&#xff0c;以达到获得更高收益、降低交易风险、提高资金利用效率的目的。通过融资&#xff0c;投资者可以用借入的资金买入更多的证券&#xff1b;通过融券&#xf…

Mixin 混入

Mixin 混入 混入 (mixin) 提供了一种非常灵活的方式&#xff0c;来分发 Vue 组件中的可复用功能。一个混入对象可以包含任意组件选项。当组件使用混入对象时&#xff0c;所有混入对象的选项将被“混合”进入该组件本身的选项。 怎么理解呢&#xff0c;就是每一个组件都会有一…

回文数真题

package com.itheima;import java.util.Scanner;public class 回文数 {public static void main(String[] args) {Scanner X new Scanner(System.in);int x X.nextInt();int sign x;int sum 0;while(x > 0){int number x % 10;sum sum * 10 number;x / 10;}if(sign …

Python 模块的概念和基本使用

视频版教程 Python3零基础7天入门实战视频教程 模块和包 在Python的标准安装中&#xff0c;包含了一组自带的模块&#xff0c;这些模块被成为“标准库”。比如常用的math,random,datetime,os,json等等。 此外&#xff0c;还有很多的第三方模块&#xff0c;比如pymysql,numpy…