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

                                                     吉大考研机试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;
}

转载于:https://www.cnblogs.com/zhchoutai/p/6801500.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值