吉大考研机试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;
}
对一副扑克牌进行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;
}
给定一个排列数,算出其二进制表示的后面有多少个连续的零。比如 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;
}