NowCoder最近在研究一个数列:
* F(0) = 7
* F(1) = 11
* F(n) = F(n-1) + F(n-2) (n≥2)
他称之为NowCoder数列。请你帮忙确认一下数列中第n个数是否是3的倍数。
输入包含多组数据。
每组数据包含一个整数n,(0≤n≤1000000)。
对应每一组输入有一行输出。
如果F(n)是3的倍数,则输出“Yes”;否则输出“No”。
0<br/>1<br/>2<br/>3<br/>4<br/>5
No<br/>No<br/>Yes<br/>No<br/>No<br/>No
#include <iostream> #include <stdio.h> using namespace std; int main() { int n;int a[8]; a[0]=1; a[1]=2; for(int i=2;i<8;i++) { a[i]=(a[i-1]+a[i-2])%3; } while(scanf("%d",&n)!=EOF){ n=n%8; if (a[n]==0) printf("Yes\n"); else printf("No\n"); } return 0; }注意输入不要用Cin,否则无法结束,被判断超时。
#include <stdio.h> #define MAXSIZE 1000000+1 int Arr[MAXSIZE]; int main() { int f0=1; int f1=2; Arr[0]=0; Arr[1]=0; int i,n; for(i=2;i<=1000000;i++){ int t=(f0+f1)%3; if(!t) Arr[i]=1; else Arr[i]=0; f0=f1; f1=t; } while(scanf("%d",&n)!=EOF){ if(Arr[n]) printf("Yes\n"); else printf("No\n"); } return 0; }
#include<iostream> (720)#include<cstdio> using namespace std; int nc[8]={0}; int main() { int n; nc[0] = 1; nc[1] = 2; nc[3] = 2; nc[4] = 2; nc[5] = 1; nc[7] = 1; while(scanf("%d", &n) != EOF) { n %= 8; if(nc[n] == 0) cout << "Yes" << endl; else cout << "No" << endl; } return 0; }
import java.util.*; public class Main{ public static void main(String[] args){ int[] array=new int[10000002]; array[0]=7; array[1]=11; for(int i=2;i<array.length;i++){ array[i]=array[i-1]%3+array[i-2]%3; } Scanner sc=new Scanner(System.in); while(sc.hasNext()){ int n=sc.nextInt(); if(array[n]%3==0){ System.out.println("Yes"); }else{ System.out.println("No"); } } } }
#include <iostream>
using std::cout;
using std::endl;
int main()
{
int n{};
while (scanf("%d",&n)!=EOF)
{
if (n % 8 == 2 || n % 8 == 6)
{
cout << "Yes" << endl;
}
else
{
cout << "No" << endl;
}
}
return 0;
}
后边的数都是前边的数相加得到的,最后要判断是不是3的倍数,那么每当数大于3的时候,把3减去就完了,那么整个序列就成了0 1 2的序列,那这中间很容易找出个循环1 2 0 2 2 1 0 1,实际上只有第三个和第七个是3的倍数了,直接n%8 == 2或6就完了。
#include <bits/stdc++.h> #include <cstdio> #include <vector> #include <algorithm> #include <cmath> using namespace std; int main() { int n; while(scanf("%d",&n)!=EOF){ if(n%4==2) printf("Yes\n"); else printf("No\n"); } return 0; }
#include<iostream> using namespace std; int main() { int n; while(cin>>n) { //规律:0 1 2 3 4 5 6 7 8 9 10 数值n //规律:1 2 0 2 2 1 0 1 1 2 0 对3取余数后,8个一个规律组 int m=n%8; if(m==2 || m==6 ) cout<<"Yes"<<endl; else cout<<"No"<<endl; } return 0; }
i = 0 7 NO
i = 1 11 NO
i = 2 18 YES
i = 3 29 NO
i = 4 47 NO
i = 5 76 NO
i = 6 123 YES
i = 7 199 NO
i = 8 322 NO
i = 9 521 NO
i = 10 843 YES
i = 11 1364 NO
i = 12 2207 NO
i = 13 3571 NO
i = 14 5778 YES
i = 15 9349 NO
i = 16 15127 NO
i = 17 24476 NO
i = 18 39603 YES
i = 19 64079 NO
#include <iostream> using namespace std; int main(int argc, const char * argv[]) { int number = 0; //scanf返回值为正确输出数据的变量个数,当一个变量都没有 //获取到数据时,此时返回-1 while (scanf("%d", &number) != - 1) { //判断%4的结果==2 if (number % 4 == 2) { cout << "YES" << endl; } else { cout << "NO" << endl; } } return 0; }
#include <stdio.h> #include <stdlib.h> /* #define MAX 100000 void NowCoder(int*, int);//大数相加 void reverse(int*); int main() { int n; while(~scanf("%d", &n)) { int data[MAX] = {0}; NowCoder(data, n); int i = 0; int sum = 0; while(i < MAX) { sum += data[i]; i++; } if(sum % 3) printf("No\n"); else printf("Yes\n"); } } void NowCoder(int digit[], int n) { int temp[MAX] = {0}; int count = 0;//进位 int i, j; for(i = 0; i <= n; i++) { if(i == 0) digit[0] = 7; else if(i == 1) { temp[0] = 7; digit[0] = 1; digit[1] = 1; } else { for(j = 0; j < MAX; j++) { int t = digit[j]; digit[j] = temp[j] + digit[j] + count; temp[j] = t; count = digit[j]/10; digit[j] = digit[j]%10; } if(count) digit[MAX-1] += count; } } reverse(digit); } void reverse(int digit[]) { int temp; for(int j = 0; j < MAX/2; j++) { temp = digit[MAX - 1 - j]; digit[MAX - 1 - j] = digit[j]; digit[j] = temp; } } */ int main() { int n; while(~scanf("%d", &n)) { printf("%s\n", ((n-2)%4 ? "No" : "Yes")); } }因为它的n可以到1000000,我在codeblocks里调试的时候设置在1000000以内的数都可以输出正确的结果,但是只要在100000~1000000里的数都不能用大数相加的方法,因为设置的数组过大导致codeblocks卡死然后停止工作。而且即使用大数相加的方法只要输入大于10000的值也得等很长时间才能出来结果。所以估计这个题的本意就是找规律。