2008年西电复试机试题

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

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");
			else
				result.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");
		else
			result.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没有变换 
		}
		else
			i++;
	 } 
	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");
		else
			vec.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小数位数
			else
				num = 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;
 } 



 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值