2015西电机试算法题

时间:2025年3月8日19:10:12 start->

Problem 1

题目描述:请写一个程序,判断给定的整数序列能否构成等差数列。

输入说明:多组数据,每组输入数据由两行构成,第一行只有一个整数n(n<1000),表示序列长度(即序列中整数的个数,0表示输入结束),第二行为n个整数。每个整数的取值区间都为[-32768—32767]->(int),证书之间以空格或挑格间隔。

输出说明:对于每一组数据,输出一个yes或no,表示该序列能够构成等差数列。

输入样本

6

23 15 4 18 35 11

3

3 1 2

0

输出样本

no

yes

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include<cstdio>
#include<algorithm>
#include<vector>

using namespace std;
int main(){
int n,num; // n->组数,num->接收元素时使用
vector<int> nums; // 也可以开一个大数组,每次置数,太麻烦,选择动态数组
while(scanf("%d",&n)!=EOF){
if(n==0){
break;
}
if(n==1){
printf("yes\n");
continue;
}
// nums.resize(n);
while(n--){
scanf("%d",&num);
nums.emplace_back(num);
}
sort(nums.begin(),nums.end());
int delta=nums[1]-nums[0]; // 保存相邻元素的差值
bool flag=true; // flag表示是否可以构成等差数列
for(int i=2;i<nums.size();++i){
if(nums[i]-nums[i-1]!=delta){
flag=false;
break;
}
}
if(flag){
printf("yes\n");
}else{
printf("no\n");
}
}
}

Problem 2

题目描述:任意输出一个三位数,判断该数是否是水仙花数,若是输出“yes”,否则输出”no”。水仙花数(Narcissistic number)也被称为超完全数字不变数(pluperfect digital invariant, PPDI)、自恋数、自幂数、阿姆斯壮数或阿姆斯特朗数(Armstrong number),水仙花数是指一个 3 位数,它的每个数位上的数字的 3次幂之和等于它本身。 例如:1^3^ + 5^3^+ 3^3^ = 153。

输入说明:一个三位数num(范围是100到999)

输出说明:”yes” or “no”

输入样本

153

输出样本

yes

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include<cstdio>

using namespace std;
int main(){
int num;
scanf("%d",&num);
int a=num%10;
int b=num/10%10;
int c=num/100;
if(a*a*a+b*b*b+c*c*c==num){
printf("yes\n");
}else{
printf("no\n");
}

return 0;
}

Problem 3

题目描述:Arnold变换时一种常见的图像置乱技术,Arnold变换定义如下:对任意N*N矩阵(素有元素相同的矩阵除外),设i,j为矩阵元素的起始下标,经过Arnold变换后行下标为i’,j’,其满足下式。

i'=(i+j) mod N

j'=(i+2j) mod N

i,j:0,1,2,...N-1

输入说明:对输入的每一个N,给出N*N矩阵的Arnold变换的周期。

输出说明

输入样本

3

8

0

输出样本

4

6

代码

1
2
3
4
5
6
#include<cstdio>

using namespace std;
int main(){

}

Problem 4

题目描述:对于一个正整数n,如果它的各位之和等于它的所有质因数之和,则该数被称为Smith数。例如,31257=3323*151,31257的各位数字之和为3+1+2+5+7=18,它的所有质因数的各位数字之和为3+2+2+3+1+5+1=18,因此,31257是一个Smith数。编写一个程序判断输入的正整数是不是Smith数。

输入说明:有多组数据,每组数据只有一个整数n(<100000,占一行),为0时表示输入结束。

输出说明:对于每一组数据,输出一个yes或no(表示该数是否为Smith数)。

输入样本

31257

123

0

输出样本

yes

no

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include<cstdio>
# define N 100000
using namespace std;

bool isPrime[N];

void init(){
memset(isPrime,true,sizeof(prime));
prime[0]=prime[1]=false; // 0和1不是素数
int upBound=sqrt(n);
for(int i=2;i<=upBound;++i){
if(isPrime[i]){
for(int j=i*i;j<=n;j+=i){
isPrime[j]=false; // 标记i的倍数为false;
}
}
}
}
int bitSum(int num){
int sum=0;
while(num){
sum+=num%10;
num/=10;
}
return sum;
}
int factorSum(int num){
int sum=0;
while(num){

}
}
int main(){
init();
int n;
while(scanf("%d",&n)!=EOF){
if(n==0)
break;
}
return 0;
}