Problem 1049 - 斐波那契数

简介: Description        斐波那契数列是如下的一个数列,0,1,1,2,3,5……,其通项公式为F(n)=F(n-1)+F(n-2),(n>=2) ,其中F(0)=0,F(1)=1,你的任务很简单,判定斐波契数列的第K项是否为偶数,如果是输出YES,否则输出NO Input 第一行,T,表示有T个测试样例。

Description

       斐波那契数列是如下的一个数列,0,1,1,2,3,5……,其通项公式为F(n)=F(n-1)+F(n-2),(n>=2) ,其中F(0)=0,F(1)=1,你的任务很简单,判定斐波契数列的第K项是否为偶数,如果是输出YES,否则输出NO

Input
第一行,T,表示有T个测试样例。
接下来T行,每行一个数据K(0<=K<=10^10000),表示要判定的是哪一项。
Output
如果第K项是偶数,输出YES,否则输出NO。
Sample Input
2
0
1
Sample Output
YES
NO
Hint

64-bit interger is not enough for 10^10000

Source
FZ

分析:该题目关键在于大数的存储,可以采用字符数组存储整数,然后可观察T(n)序列从0开始实际上是一个以3为周期的 “偶奇奇”的重复序列。
T(0) = 0 = YES
T(1) = 1 = NO
T(2) = 1 = NO
T(3) = 2 = YES
T(4) = 3 = NO
T(5) = 5 = NO
T(6) = 8 = YES
……

可见,当n为3的倍数(包括0倍)时,则T(n)偶数,否则是奇数。
这就需要用到一个小技巧了:任何10进制数,如果各位数字的和能被3整除,则该数整体能被三整出,例如,
12 => 1+2=3,3能被3整除,所以12能被3整除
1293 => 1+2+9+3 = 15,15能被3整除,所以1293能被3整除

C代码:

#include<stdio.h>
#include<string.h>
int a,b,c,d,e,sum;
char s[10005];

int main()
{
    int t;
    scanf("%d",&t);
    while (t--)
    {
          sum=0;
          scanf("%s",&s);
          d=strlen(s);
          for (a=0;a<d;a++) sum=sum+(s[a]-'0');
          if (sum%3==0) printf("YES\n"); else printf("NO\n");
    }
}
#include<stdio.h>
#include<string.h>
char s[10010];
int main()
{
    int n,i,sum,len;
    while(scanf("%d",&n)!=EOF)
    {
        while(n--)
        {
            sum=0;
            scanf("%s",s);
            len=strlen(s);
            for(i=0;i<len;i++)
                sum+=s[i]-'0';
            if(sum%3==0) printf("YES\n");
            else printf("NO\n");
        }
    }
    return 0;
}

C++代码:

#include <string>
using namespace std;

bool IsEvent(string bigInt)
{
    int sum = 0;
    for (size_t i=0; i<bigInt.size(); ++i)
    {
        sum += (bigInt[i] - '0');
    }

    return (sum % 3)==0;
}

#include <iostream>
int main()
{
	int n;
	string bigInt;
	cin>>n;
	for (int i=0; i<n; ++i)
	{
		cin>>bigInt;
		cout<<(IsEvent(bigInt) ? "YES" : "NO")<<endl;
	}
	return 0;
}



目录
相关文章
|
6月前
|
开发框架 .NET
poj 3468 A Simple Problem with Integers线段树区间修改
题目意思很简单,有N个数,Q个操作, Q l r 表示查询从l到r 的和,C l r v 表示将从l到r 的值加上v,明显的线段树,不知道线段树的人肯定暴力,肯定超时,哈哈!!
19 0
欧拉计划Problem 5 最小公倍数
欧拉计划Problem 5 最小公倍数
|
数据挖掘
HDU-1032,The 3n + 1 problem(水题)
HDU-1032,The 3n + 1 problem(水题)
HDOJ 1016 Prime Ring Problem素数环【深搜】
HDOJ 1016 Prime Ring Problem素数环【深搜】
89 0
HDOJ 1016 Prime Ring Problem素数环【深搜】
|
C语言
HDOJ 1016 Prime Ring Problem素数环【深搜2】
HDOJ 1016 Prime Ring Problem素数环【深搜】
78 0
|
Go
HDOJ(HDU) 1977 Consecutive sum II(推导、、)
HDOJ(HDU) 1977 Consecutive sum II(推导、、)
87 0
HDOJ1002题A + B Problem II,2个大数相加
HDOJ1002题A + B Problem II,2个大数相加
88 0
|
算法 BI
约瑟夫问题(Josephus problem)的klog(n)解法
约瑟夫问题是一个经典的算法问题,其解决过程涉可能用到的数据结构有数组、链表,涉及的算法包括模拟、递归、递推、动态规划等等,因此非常适合做一道面试题。   问题描述: 首先n个候选人围成一个圈,依次编号为0..n-1。然后指定一个正整数k,并0号候选人开始按从1到k的顺序依次报数,n-1号候选人报数之后,又再次从0开始。当有人报到K时,这个人被淘汰,从圈里出去。下一个人从1开始重新报
4279 0
|
算法
动态规划法(八)最大子数组问题(maximum subarray problem)
问题简介   本文将介绍计算机算法中的经典问题——最大子数组问题(maximum subarray problem)。所谓的最大子数组问题,指的是:给定一个数组A,寻找A的和最大的非空连续子数组。
1733 0