坑题

来源:互联网 发布:事业单位会计软件 编辑:程序博客网 时间:2024/06/14 12:08

坑题1

给定一段连续的整数,求出他们中所有偶数的平方和以及所有奇数的立方和。
Input
输入数据包含多组测试实例,每组测试实例包含一行,由两个整数m和n组成。
Output
对于每组输入数据,输出一行,应包括两个整数x和y,分别表示该段连续的整数中所有偶数的平方和以及所有奇数的立方和。
你可以认为32位整数足以保存结果。
Sample Input
1 3
2 5
Sample Output
4 28
20 152
【本题坑点】
输入的两个数m,n,有可能是m<=n,也有可能是m>n(此种情况一定要注意)
AC代码:

#include<iostream>using namespace std;int main(){    long long int a,b;    while(cin>>a>>b){        if(a>b){int tmp=a;a=b;b=tmp;}        long long int sum1=0,sum2=0;        for(long long int i=a;i<=b;i++){            if(i%2==0) sum1+=(i*i);            else sum2+=(i*i*i);        }        cout<<sum1<<" "<<sum2<<endl;    }    return 0;}

坑题2

There are another kind of Fibonacci numbers: F(0) = 7, F(1) = 11, F(n) = F(n-1) + F(n-2) (n>=2).
Input
Input consists of a sequence of lines, each containing an integer n. (n < 1,000,000).
Output
Print the word “yes” if 3 divide evenly into F(n).

Print the word “no” if not.
Sample Input
0
1
2
3
4
5
Sample Output
no
no
yes
no
no
no

【直接看代码】
代码一(超时):

#include<cstdio>typedef long long int ll;ll f(ll n){    if(n==0) return 7;    else if(n==1) return 11;    else return f(n-1)+f(n-2);}int main(){    ll n;    while(scanf("%lld",&n)!=EOF){        if(f(n)%3) printf("no\n");        else printf("yes\n");    }    return 0;}

代码二(long long溢出):

#include<cstdio>typedef long long int ll;const ll maxn=1000000+5;ll a[maxn];void init(){    a[0]=7;a[1]=11;    for(int i=2;i<maxn;i++)        a[i]=a[i-1]+a[i-2];}int main(){    ll n;    init();    while(scanf("%lld",&n)!=EOF){        if(a[n]%3) printf("no\n");        else printf("yes\n");    }    return 0;}

AC代码(一):

#include<iostream>using namespace std;const int maxn=1000000+5;int a[maxn];void init(){    a[0]=7%3;a[1]=11%3;    for(int i=2;i<maxn;i++){        a[i]=(a[i-1]%3+a[i-2]%3)%3;    }}int main(){    init();    int n;    while(cin>>n){        if(a[n]==0) cout<<"yes"<<endl;        else cout<<"no"<<endl;    }    return 0;}

AC代码(二)(打表观察规律):

#include<cstdio>typedef long long int ll;const ll maxn=1000000+5;ll a[maxn];void init(){    a[0]=7;a[1]=11;    for(int i=2;i<maxn;i++)        a[i]=a[i-1]+a[i-2];    //打表观察规律1,2,0,2,2,1,0,1    for(int i=0;i<20;i++){        printf("a[%d]=%lld   a[%d]%3=%d\n",i,a[i],i,a[i]%3);    }}int main(){    //init();    int n;    int b[10]={1,2,0,2,2,1,0,1};    while(scanf("%d",&n)!=EOF){        if(b[n%8]) printf("no\n");        else printf("yes\n");    }    return 0;}

坑题3

寻找3个互相不同的正整数x,y,z,使得对于给定的正整数n,有2/n=1/x+1/y+1/z,输入一个正整数n,输出任意一组解x,y,z使得该式子成立,若不存在解,输出-1

下面是个人认为不严格的算法,直接给代码:

//瞎构造,令x=n。得到1/n=1/y+1/z,再令y=(n+1)//得z=n(n+1),再搞一下x=y,x=z,y=z的情况发现n=1不行//显然这种做法是不严格的,不一定正确的。。。#include<iostream>using namespace std;int main(){    int n;    cin>>n;    if(n==1) cout<<"-1"<<endl;    else cout<<n<<" "<<n+1<<" "<<n*(n+1)<<endl;    return 0;}
原创粉丝点击