码迷,mamicode.com
首页 > 其他好文 > 详细

九度oj题目&吉大考研10年机试题全解

时间:2017-05-03 14:40:06      阅读:292      评论:0      收藏:0      [点我收藏+]

标签:space   name   nbsp   方法   复杂   简单题   时间   std   []   

                                                     吉大考研机试2010年题目

题目一(jobdu1478:三角形的边)、    http://ac.jobdu.com/problem.php?pid=1478

      给出三个正整数,计算最小的数加上次小的数与最大的数之差。

题目分析:

      简单题。能够用非常多方法解决


AC代码:


#include<iostream>
using namespace std;
int main()
{
    int a,b,c,ma;
    while(cin>>a>>b>>c){
        ma=0;
        if(a==0) break;
        if(ma<a) ma=a;
        if(ma<b) ma=b;
        if(ma<c) ma=c;
        cout<<(a+b+c)-2*ma<<endl;
    }
    return 0;
}

题目二(jobdu1476:平方因子)、
    http://ac.jobdu.com/problem.php?pid=1476
    给定一个数n,判定它是否有一个不为1的全然平方数因子。

也就是说。是否存在某个k。k>1。使得k*k可以整除n。

题目分析:

      数字记录全部平方数,在小于n的情况下进行測试就可以。


AC代码:


/**
 *简单模拟
 */
#include<iostream>
#include<string>
using namespace std;
int main()
{
    int n,a[101];
    for(int i=1;i<=100;i++) a[i]=i*i;
    while(cin>>n&&n){
        int ok=0;
        for(int i=2;a[i]<=n;i++){
            if(n%a[i]==0){
                cout<<"Yes"<<endl;
                ok=1;//标记是否找到满足条件的数
                break;
            }
        }
        if(!ok) cout<<"No"<<endl;
    }
    return 0;
}
 
题目三(jobdu1477:怪异的洗牌&&jobdu1479:移位与旋转)、   http://ac.jobdu.com/problem.php?pid=1477

      对一副扑克牌进行k个移位(shift)和翻转之后(filp),数组结果。

题目分析:

      因为题目数据较小。没有必要去优化移位函数(shift)的时间复杂度,仅仅须要普通的移位函数就可以,对于翻转函数,进行折半交换就可以。


AC代码:


#include<iostream>
using namespace std;
int n,k;
void shift(int a[],int k){//向右循环k次
    while(k--){
        int tmp=a[n-1];
        for(int i=n-2;i>=0;i--){
            a[i+1]=a[i];
        }
        a[0]=tmp;
    }
}
void filp(int a[],int n){//翻转数组的前n个数
    int i,j,tmp;
    for(i=0,j=n-1;i<j;i++,j--){
        tmp=a[i];
        a[i]=a[j];
        a[j]=tmp;
    }
}
void print(int a[]){
    for(int i=0;i<n;i++) cout<<a[i]<<" ";
    cout<<endl;
}
int main()
{
    while(cin>>n>>k&&n){
        int m,a[1005];
        for(int i=0;i<n;i++) a[i]=i+1;
        //print(a);
        for(int i=0;i<k;i++){
            cin>>m;
            shift(a,n-m);
            //print(a);
            filp(a,n/2);
        }
        print(a);
    }
    return 0;
}
 
题目四(jobdu1466:排列与二进制)、    http://ac.jobdu.com/problem.php?pid=1466

      给定一个排列数,算出其二进制表示的后面有多少个连续的零。比方  p(10,5)=30240。

假设用二进制表示为p(10,5)=30240=( 111011000100000)b,也就是说。最后面有5个零。


题目分析:

      对于一个数n,n包括(可以整除几个2)几个2,其二进制末尾就有几个0。比方 n=12

12/2=6(0)    6/2=3(0)   3/2=1(1);圆括号中面表示余数,12含有2个2,12的二进制是(1100)。尾部有2个0.


AC代码:


/**
 *一个数包括几个2,其二进制末尾就有几个0
 *比如12=(1100) 12/2=6; 6/2=3,有两个2
 */
#include<iostream>
using namespace std;
int main()
{
    int n,m;
    while(cin>>n>>m&&n){
        int cnt=0;
        for(int i=n;i>=n-m+1;i--){
            int k=i;
            while(k%2==0){
                cnt++;
                k/=2;
            }
        }
        cout<<cnt<<endl;
    }
    return 0;
}

九度oj题目&amp;吉大考研10年机试题全解

标签:space   name   nbsp   方法   复杂   简单题   时间   std   []   

原文地址:http://www.cnblogs.com/zhchoutai/p/6801500.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!