1387-斐波那契数列
- 内存限制:32MB 时间限制:1000ms 特判: No
题目描述:
故事背景,太懒了就不写了,给你一个正整数x判断其是否为斐波那契数,是输入YES,否则输出NO。
斐波那契数列定义 F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n>2,n∈N*)
输入描述:
多组输入 每组输入一个数x(1 <= x <= 2^64)当x为0时输入结束
输出描述:
每组数据输出一行YES或NO
样例输入:
1 4 18446744073709551616 0
样例输出:
YES NO NO
提示:
输入组数不超过1000100组
输入的数据的范围是1到2^64.
而无符号的long long 的最大值是2^64-1,那么这道题就不能考虑直接输入无符号long long型数据了!
可以考虑输入字符串,然后特判这个数为2^64,其他的数字转化成无符号的长整形,然后再进行判断。
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<stdlib.h>
#include<iostream>
char s[25];
unsigned long long ss[95];
using namespace std;
unsigned long long x;
int flag=0;
void init()
{
ss[0]=1;
ss[1]=1;
for(int i=2; i<93; ++i)
ss[i]=ss[i-1]+ss[i-2];
}
int main()
{
init();
while(~scanf("%s",s))
{
if(s[0]=='0') break;
char sss[]="18446744073709551616";
if(strcmp(sss,s)==0)
{
printf("NO\n");
continue;
}
x=s[0]-'0';
int l1=strlen(s);
for(int i=1; i<l1; ++i)
x=x*10+s[i]-'0';
for(int i=0; i<93; ++i)
{
if(ss[i]==x)
{
printf("YES\n");
break;
}
else if(ss[i]>x)
{
printf("NO\n");
break;
}
}
}
return 0;
}