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的值也得等很长时间才能出来结果。所以估计这个题的本意就是找规律。
import java.util.Scanner; public class Main{ /** * 通过上面的公式发现数列最终是求11出现的个数即只要11出现3倍的时候才能被整除,正好n=2,6,10,14......能被3整除 * 即n%4==2的即可被3整除 */ public static void main(String[] args) { Scanner in = new Scanner(System.in); while (in.hasNext()) { int n = in.nextInt(); System.out.printf("%s\n",( n % 4 == 2)?"Yes":"No"); } in.close(); }