当前位置: 代码迷 >> 综合 >> 2008年西电复试机试题
  详细解决方案

2008年西电复试机试题

热度:35   发布时间:2023-10-23 03:40:27.0

第一题:判断是否等差数列(仅供参考)

1、题目介绍

(1)若为等差数列,则返回Yes;

(2)若不为等差数列,则返回No;

2、解题思路

(1)对n个整数进行排序(从小到大)

(2)遍历n个整数,判定等差是否相等

3、测试用例

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

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

输入样本:
6
23 15 4 18 35 11

3 1 2
0
输出样本:
Yes
No 

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{int n, line;vector <string> result;cin>>n;while(n!=0){if (n == 1)  // 当只有一个整数时,就是等差数列 {result.push_back("No");}else  {int *arr = new int[n];for(int i=0; i < n; i++)cin>>arr[i];sort(arr, arr+n);  // 注意排序的参数,首地址+结束地址 line = arr[1] - arr[0];bool flag = true;for(int i = 2;i < n; i++){if (arr[i] - arr[i-1] != line){flag = false;break;}}if (flag == true)result.push_back("No");elseresult.push_back("Yes"); }cin>>n;		}vector<string>::iterator iter;for(iter = result.begin(); iter != result.end(); iter++) cout<<*iter<<endl;return 0;}

 

第二题:判定给定正整数是否为“水仙花数”(仅供参考)

1、题目介绍

(1)若为水仙花数,则返回Yes;

(2)若不为水仙花数,则返回No;

(3)水仙花数:各位数字的立方和等于该数

2、该题难点

a.获得整数的各位数字

b.多组数据,每组数据要用一个动态数组(vector)存储结果 

c.由于这里不知道测试用例的由多少,所以这里只有使用vector 

3、测试用例

输入说明:有多组数据,每组数据为一个正整数n,占一行,为0时表输入结束。

输出说明:对于每一组数据,输出一个yes或者no。

input: 
    153
    111
    370
    422
    0 
output:
    yes
    no
    yes
    no

#include<iostream>
#include<vector>
#include<math.h>
using namespace std;
int main()
{int n;vector <string> result;cin>>n;while(n != 0){// 获取每位的数字int sum = 0, temp = n;while(n != 0){sum += pow(n%10, 3);n = n / 10;} // 判定是否为水仙花数 if (sum == temp)result.push_back("yes");elseresult.push_back("no");cin>>n;}// 遍历动态数组vector,并且打印每个测试用例的结果 vector <string>::iterator t;for(t=result.begin(); t!=result.end();t++)cout<<*t<<endl;return 0;
}

第三题:判断是否等差数列(仅供参考)

1、题目介绍

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

2、解题思路

问题转化求,矩阵任意一点,经过num次Arnold变换后,该点的行、列左边不变,而num就是周期 

3、测试用例

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

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

input: 
    3
    8
    0 
output:
    4
    6

#include<iostream>
#include<vector>
using namespace std;
int main()
{int i=1, j=1;    //矩阵任意一点,尽量选择下标小的,防止N太小,取不到 int num = 0, N, temp; // num记录进行Arnold变换次数,临时记录i值,便于跟新i,j值 vector <int> vec;cin>>N;while(N != 0){num++;// 更新i,j temp = i;i = (i+j) % N;j = (temp+2*j)%N;// 检验是否为变为原来矩阵 if (i == 1 && j == 1){vec.push_back(num);cin>>N;num = 0;}}// 遍历,并且打印各组测试用例结果 vector <int>::iterator t;for(t=vec.begin();t!=vec.end();t++)cout<<*t<<endl;return 0;
}

 

第四题:判断是否为Smith数(仅供参考)

1、题目介绍

Smith数:该整数的各位之和==其所有质因数的各位之和

如31257=3*3*23*151,各位数字之和==3+1+2+5+7,质因数各位数字之和==3+3+2+3+1+5+1

2、解题思路 

 备注:获取整数num的所有质因子
 for i=2 to num
    if (num % i == 0) //能整除,则i为质因子
        num = num / i;
    else 
        i++; 

2、测试用例

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

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

input:

31257

123

0

output:

yes

no

#include<iostream>
#include<vector> using namespace std;
int getDataSum(int data)   
{  // 获取整数各位数字之和 int sum = 0;while(data != 0){sum += data % 10;data = data / 10;}return sum;} 
int getPrimeSum(int data)
{  // 获取所有质数的各位之和 int sum = 0;for(int i=2; i<=data;){if (data % i == 0)        // i为质数 {	sum += getDataSum(i); // 获取每个质数的每位之和 data = data / i;      // 注意i没有变换 }elsei++;} return sum;} 
int main()
{int num;vector <string> vec;while(true)                     // 无限循环,直到输入0为止 {cin>>num;if(num == 0)break;int sum1 = getDataSum(num);  // 获取整数的各位数字之和 int sum2 = getPrimeSum(num); // 获取所有质数的各位数字之和 if (sum1 == sum2)vec.push_back("yes");elsevec.push_back("no");}// 遍历动态数组,并且打印结果 vector <string>::iterator t;for(t=vec.begin(); t!=vec.end();t++)cout<<*t<<endl;return 0;} 

 

 

第五题:大数的幂运算,即计算R^n(仅供参考)

1、解题思路

将R转化为整数,其次结果R^n小数位数(不包括小数点)=R的小数位数*n;

1、测试用例

输入说明:有多组数据,每组数据占一行,用一对数据表示,第一个数据是R(含有小数点共6位),第二个数据是n,两个数之间有一个空格。

输出说明:对每个输入输出其结果占一行。

input:

95.123  12

0.4321 20

6.7592 9 

98.999 10

1.0100 12

output:

548815620517731830194541.899025343415715973535967221869852721
    .00000005148554641076956121994511276767154838481760200726351203835429763013462401
    43992025569.928573701266488041146654993318703707511666295476720493953024
    29448126.764121021618164430206909037173276672
    90429072743629540498.107596019456651774561044010001
    1.126825030131969720661201

#include<iostream>
#include<vector> using namespace std;
int* Multiply(int *result, int data, int &len)  
// result为运算结果,data乘数,len当前运算结果所的位数 
{  // 获取整数各位数字之和 int carry = 0, i = 0; // carry进位// 计算结果result与R的乘积 for(i = 0; i < len; i++){result[i] = result[i] * data + carry;carry = result[i] / 10;result[i] = result[i] % 10;}// 进位while(carry)  // 若进位不为零,则一直进位 {result[i++] = carry % 10;carry = carry / 10;} len = i;  // i从0开始的,所有i++后,才是当前乘法后的位数。 return result;} int main()
{string R;     int n;          vector <string> vec;while(cin>>R>>n){int len = 1;  // 初始化运算结果所占位数 int num = 0, position = 0;     // num为浮点数R转化为整数,position为小数部分的位数 int *result = new int[1000];   // 存储运算结果 for(int i = 0;i<1000;i++)      // 每位存储结果初始化 result[i] = 0;// 将幂运算的底数转化为整数,以及计算幂运算后小数位数 for(int j = 0; j < R.length(); j++){if(R[j] == '.')position = (R.length() - j - 1) * n;  // R^n小数位数elsenum = num * 10 + int(R[j])- 48;       // 将R转化为整数 }result[0] = 1;   // 最初运算结果       // 计算n次幂,其中不包括小数点 for(int j = 0; j < n; j++)result = Multiply(result, num, len);// 规格化运算结果string str = "";if (len < position) // 小数位数大于积位数,添加0 {str += '.';     // 添加小数点str.append(position-len, '0');  // 小数点后面用0填充 }int start_index = 0;                // 记录最低位非零的位置 while (start_index < position && result[start_index] == 0) // 找到小数最低位的非零位置start_index++; for(int i = len - 1; i>=start_index; i--){if (len > position && i == position - 1)str += '.';char temp = result[i] + 48;    // 将数字(0~9)转化为字符('0'~'9') str +=  temp;}vec.push_back(str); }// 遍历动态数组,并且打印结果 vector <string>::iterator t;for(t=vec.begin(); t!=vec.end();t++)cout<<*t<<endl;return 0;}