大数数组中滚动数组的应用

对于数组中的大数加法 为了节省内存 可以考虑使用滚动数组
杭电1250

Problem Description

A Fibonacci sequence is calculated by adding the previous two members the sequence, with the first two members being both 1.
F(1) = 1, F(2) = 1, F(3) = 1,F(4) = 1, F(n>4) = F(n - 1) + F(n-2) + F(n-3) + F(n-4)
Your task is to take a number as input, and print that Fibonacci number.

Input

Each line will contain an integers. Process to end of file.

Output

For each case, output the result in a line.

Sample Input

100

Sample Output

4203968145672990846840663646

Note:
No generated Fibonacci number in excess of 2005 digits will be in the test data, ie. F(20) = 66526 has 5 digits.

这题的位数为2005 如果硬开数组的 很容易超内存

在讨论区里面看到一个滚动数组的使用 可以有效的节省内存  此题实际要用的行数只有5个 无非是五个数的循环使用 更新          在对 i遍历的时候 i%5可以控制值一直在0 到 5 之间循环  每次对一个行进行运算之前 先清空数组 然后再附值

实际就是数据的更新过程

上代码

#include<iostream>
#include<cstring>
using namespace std;
short x[5][2008];
int main()
{
 int n,i,j,sum,add;
 while(cin>>n)
 {
  
  if(n<=4)
  {
   cout<<1<<endl;
   continue;
  }
  memset(x,0,sizeof(x));
  x[1][2005]=1;
  x[2][2005]=1;
  x[3][2005]=1;
  x[4][2005]=1;
  for(i=5;i<=n;++i)
  {
   memset(x[i%5],0,sizeof(x[i%5]));       //注意清零。
   add=0;
   for(j=2005;j>=0;j--)
   {
    sum=x[(i-1)%5][j]+x[(i-2)%5][j]+x[(i-3)%5][j]+x[(i-4)%5][j]+add;
    add=sum/10;
    x[i%5][j]=sum%10;
   }
  }
  for(i=0;i<=2005;i++)
  {
   if(x[n%5][i]!=0) break;
  }
  for(j=i;j<=2005;j++)
  cout<<x[n%5][j];
  cout<<endl;
 }
 return 0;
}

时间: 2024-12-11 02:27:49

大数数组中滚动数组的应用的相关文章

把数组中的数据提取出来,包括数组中的数组

/*** 用闭包 实现数组中及数组内部数组 的数据提取出来*/ var myarr = [1,2,8,[3],[4,[5,[6],['a','b']],[9]]]; function tqFun(qcArr1){ var tempArr = []; function bbFun (qcArr){ for(var i=0; i<qcArr.length; i++){ if(qcArr[i] instanceof Array){ bbFun(qcArr[i]); }else{ tempArr.pus

返回一个整数数组中最大数组的和

一:题目内容及设计思路 1.题目: 返回一个整数数组中最大数组的和 2.要求: (1)输入一个整数数组,数组里有正数也有负数. (2)数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. (3)求所有子数组的和的最大值.有球时间复杂度为O(n). 3.设计思路: (1)利用while循环输入各个整数,用getchar()函数判断while循环是否结束,当用户按下回车键时,即getchar()=='\n'时,跳出while循环: (2)记录下循环的次数,即数组长度: (3)调用函数Co

java学习第05天(数组常见操作、数组中的数组)

(4)数组常见操作 a.遍历取值 class ArrayDemo3 { public static void main(String[] args) { //System.out.println("Hello World!"); //格式1 /* 需要一个容器,但不明确容器的具体数据. */ //int[] arr = new int[8]; //格式2 /* 需要一个容器,储存一直的具体数据. */ //元素类型[] 数组名 = new 元素类型[](元素,元素,....); //i

转:最小区间:k个有序的数组,找到最小区间使k个数组中每个数组至少有一个数在区间中

转:http://www.itmian4.com/thread-6504-1-1.html 最小区间原题 k个有序的数组,找到最小的区间范围使得这k个数组中,每个数组至少有一个数字在这个区间范围内.比如: 数组1:[4, 10, 15, 24, 26] 数组2:[0, 9, 12, 20] 数组3:[5, 18, 22, 30] 最小的区间是[20, 24],这个区间包含了数组1中的24,数组2中的20,数组3中的22 思考时间~~~ 分析 该题看起来还算比较简单,大家通常都会想到:为每一个数组

找出一个整数数组中超过数组长度一半的元素(Java)

Question:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字 package com.study.zhipengs.test; import java.util.Arrays; import java.util.HashMap; import java.util.Map; /** * 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字. * 例如输入一个长度为9的数组{1, 2, 3, 2, 2, 2, 5, 4, * 2}.由于数字2在数组中出现了5次,超过数组长度

使用vue中的v-for在模板中遍历数组中的数组

接口返回数据, 需要每一项的数据, 刚开始不知道怎么取rule中的数据, 在methods中处理了好久, 后来发现一个好方法, 可以在模板中遍历嵌套遍历: 红色框中遍历外层数据, 黄色框中可以继续遍历,取出rule中的数据; 数据处理如下: 效果图: 灰色框中是数组rule中的数据 原文地址:https://www.cnblogs.com/Shysun/p/9745916.html

js中的数组中的数组相加

在MVC中View中遇到了这个问题,就是js中数字相加的时候,老是加不到一起: <span style="font-size:18px;"> function Table() { var z=0; for (var i = 0; i < 3;i++) { <span style="font-family:Calibri;">z</span><span style="font-family:SimSun;&qu

PHP学习记录数组中的数组的指针

unshift在数组头增加一个元素,push在数组尾增加一个元素,shift删除数组的第一个元素,pop删除数组的最后一个元素: <?php $item=array('苹果'); //在数组最前添加一个元素 array_unshift($item,'香蕉'); print_r($item); //在数组最后添加一个数组 array_push($item,'菠萝'); print_r($item); //删除第一个元素 array_shift($item); print_r($item); //删

angular ng-repeat数组中的数组

//先定义一个数组 anular代码: var app = angular.module('serApp', []); app.controller('indexCtrl', function($scope, $http) { $scope.arrs = [{ n:'a': arr:['1','2','1'] },{ n:'b': arr:['4','5','6'] }]; }) html 代码: <div ng-controller="indexCtrl">