问题描述
Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1。
当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少。
输入格式
输入包含一个整数n。
输出格式
输出一行,包含一个整数,表示Fn除以10007的余数。
说明:在本题中,答案是要求Fn除以10007的余数,因此我们只要能算出这个余数即可,而不需要先计算出Fn的准确值,再将计算的结果除以10007取余数,直接计算余数往往比先算出原数再取余简单。
样例输入
10
样例输出
55
样例输入
22
样例输出
7704
数据规模与约定
1 <= n <= 1,000,000。
代码:
#include<iostream>
#include<cmath>
#include<cstdio>
#define N 1000009
long long int a[N];
using namespace std;
int main()
{
long long int n;
a[1]=1;
a[2]=1;
for(long long int i=3;i<=1000009;i++)
{
a[i]=(a[i-1]+a[i-2])%10007;
}
while(cin>>n&&n!=0)
{
cout<<a[n]<<endl;
}
}
#include<iostream>
#include<cmath>
#include<cstdio>
#define N 1000009
int a[N];
using namespace std;
int main()
{
int n;
a[1]=1;
a[2]=1;
for(int i=3;i<=1000009;i++)
{
a[i]=(a[i-1]+a[i-2])%10007;
}
while(cin>>n&&n!=0)
{
cout<<a[n]<<endl;
}
}
收获感悟:#define定义多大的数都可以,
能支持十进制下大约10位数-21474836482147483647[-2^312^31-1]
longlong能支持十进制下大约19位数 你要的数是可以存下的
long long 为64位整数类型,一般的long long为64位,由于负数补码的原因,第一位作为符号位,因此有63位可用。则取值范围为-263到263-1 取210约等于1000多一点,则大概为9x1018这么多,9后面18个0,建议大大于这个数就考虑高精度相关 具体值为9223372036854775807
或者考虑无符号的unsigned long long 不能表示负数但是可以到2^64-1 具体取值到18446744073709551615 18后面18个0,1.8410^19
你的数是7后面18个0,正好可以long long 存下,但是再加两下基本就爆负了,基本没有可运算性,作累加统计还行,但要参加大数运算还是高精度或者两个高低位longlong开个结构体搞下吧。建议高精度背下来。
参考资料:
c++有如下基本数据类型
bool 布尔型 - true,false
(signed) char 有符号字符型 1 -128~127
unsiged char 无符号字符型 1 0~255
(signed)short(int) 有符号短整型 2 -32768~32767
unsignedshort(int) 无符号短整型 2 0~65535
(signed) int 有符号整型 4 -(2的31次方)~2的31次方-1
unsigned (int) 无符号整型 4 0~(2的32次方-1)
(signed)long (int) 有符号长整型 4 -(2的31次方)~(2的31次方-1)
unsigned long(int) 无符号长整型 4 0~(2的32次方-1)
float 实型 4 -(10的38次方)~10的38次方
double 双精度型 8 -(10的308次方)~10的308次方
long double 长双精度型 8 -(10的308次方)~10的308次方
void 无值型 0 无值