2019第十届蓝桥杯省赛C/C++B组第三题

1.题目
数列求值:给定数列1, 1, 1, 3, 5, 9, 17, …,从第4 项开始,每项都是前3 项的和。求第20190324 项的最后4 位数字。
2.思路:
改一下求斐波那契数列的代码。
3.代码:

//存放在静态存储区
#include <iostream>
using namespace std;
const int Max=30000000;

int a(int b[],int n)
{
 b[1]=b[2]=b[3]=1;
 for(int i=4;i<=n;i++)
  {
   b[i]=(b[i-1]+b[i-2]+b[i-3])%10000;//
  }
  return b[n];
}

int main() {
 static int b[Max];
 int n;
 cin>>n;
 cout<<a(b,n);
 return 0;
}


 //存放在堆上
#include<iostream>
using namespace std;
const int Max=30000000;
int a(int b[],int n)
{
 b[1]=b[2]=b[3]=1;
 for(int i=4;i<=n;i++)
  {
   b[i]=(b[i-1]+b[i-2]+b[i-3])%10000;//
  }
  return b[n];
}
int main(){
    int *b = new int[Max];        
    int n;
    cin>>n;
   cout<<a(b,n);
    return 0;
}

4.总结:
当时写代码时候,直接定义了一个局部整形数组,结果栈溢出了(int占四个字节(Byte),栈的大小是2M。换算关系:1M=1024KB,1KB=1024B。需要字节:201903244=80761296,栈的字节:21024*1024=2077152。显然不够)。
解决方法:
一,让数组存在静态存储区,两种方法:1,声明为全局变量。2,声明为静态变量。
二,让数组存在堆中:比如:int *list=new int[30000000];
总结下内存的三种分配方式:
1. 从静态存储区分配:此时的内存在程序编译的时候已经分配好,并且在程序的整个运行期间都存在。全局变量,static变量等在此存储。
2. 在栈区分配:相关代码执行时创建,执行结束时被自动释放。局部变量在此存储。栈内存分配运算内置于处理器的指令集中,效率高,但容量有限。
3. 在堆区分配:动态分配内存。用new/malloc时开辟,delete/free时释放。生存期由用户指定,灵活。但有内存泄露等问题
关于为什么只求最后四位数:int表示不了了。看C 标准库 - <limits.h>就知道了。
limits.h 头文件决定了各种变量类型的各种属性。定义在该头文件中的宏限制了各种变量类型(比如 char、int 和 long)的值。这些限制指定了变量不能存储任何超出这些限制的值,例如一个无符号可以存储的最大值是 255。
库宏
下面的值是特定实现的,且是通过 #define 指令来定义的,这些值都不得低于下边所给出的值。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_44002167/article/details/88898085
今日推荐