只能说没别人聪明,能推出公式,只能把符合的数打印出来,找规律
比赛的时候没考虑到1和4,还有一个小细节,导致没有AC,现在AC了,936MS。
细节在下面注释已经写了。
#include<iostream> #include<cstdio> using namespace std; int main() { //可以先把1-100符合的样子打印出来,发现每20个是一个周期,所以打了两张表,a表为十位数是偶数的,b表为十位数是奇数的 int a[10]={1,1,0,1,1,1,0,1,1,1}; int b[10]={0,1,1,1,0,1,1,1,0,1}; int t; cin>>t; while(t--) { long long int n; cin>>n; if(n==1||n==4) {cout<<"False"<<endl;continue;}//如果是1和4的话那么y只能为0,而0不是一个正整数,所以不符合。 int x=n%100/10%2;//一开始用的是x=n/10%10%2 但是这么做超时,改成这样时间936MS,好紧啊,因为这个数可能很大先求余的话求出来的数就只有两位,而先除的话那么求出来的数可能还是很长, //所以对时间可能有一定影响 int y=n%10; if((!x&&a[y])||(x&&b[y])){ cout<<"True"<<endl; } else{ cout<<"False"<<endl; } } return 0; }
补充:列出从1-12的平方数,1,4,9,16,25,36,49,64,81,100,121,144
运用数学归纳法:
可以看出相两个数之差为:3,5,7,9,11,13,15,17,19,21,23
每隔一个数之差为:8,12,16,20,24,28,32,36,40,44
那么也就是所从3开始到无穷大,只要是奇数,必有两个相邻的数的平方之差为这个奇数,如果是偶数,那么从8开始,同理可得必有两数之差可为这个偶数,
那么得出结论:(n>=3&&n%2==1)||(n>=8&&n%4==0)符合这个条件即是True,否则为False
提示:相同代码c++超时,换成c218MS,以后尽量写c
#include<stdio.h> int main() { int t; scanf("%d",&t); int n; while(t--) { scanf("%d",&n); if((n>=3&&n%2)) printf("True\n"); else if((n>=8&&!(n%4))) printf("True\n"); else printf("False\n"); } return 0; }