大学电子系C++模拟考试

随手附上一些代码,未必是最优解,仅供参考。

加密四位数

【问题描述】
输入一个四位数,将其加密后输出。方法是将该数每一位的数字加9,然后除以10取余作为该位上的新数字,最后将千位上的数字和十位上的数字互换,组成加密后的新四位数。 (顺序结构,不考虑特殊情况)

【样例输入】
1368

【样例输出】
5207

【样例说明】
1368的四位数字分别是1、3、6、8,对每个数字加9后对10求余的结果为0、2、5、7,交换千位和十位数字后为5、2、0、7,加密后的新四位数为5207

思路

逐个拆开数字,然后加上9再对10取余。

也可以不用像我写那么麻烦,合在一起一气呵成。

#include
using namespace std;
int main()
{
	int n,a,b,c,d;
	cin>>n;
	a=n%10;
	n/=10;
	b=n%10;
	n/=10;
	c=n%10;
	n/=10;
	d=n;
	a=(a+9)%10;
	b=(b+9)%10;
	c=(c+9)%10;
	d=(d+9)%10;
	swap(b,d);
	cout<<d<<c<<b<<a;
}

分段函数16

【问题描述】有一分段函数如下,请编写程序,输入x值,输出y值。

大学电子系C++模拟考试_第1张图片

【样例输入1】
-5.5

【样例输出1】
-6.20789

【样例输入2】
0.5

【样例输出2】
1.91619

【样例输入3】
5.5

【样例输出3】
13.1757

思路

选择结构的考查,注意运算细节即可。

#include
#include
using namespace std;
int main()
{
	double x,y;
	cin>>x;
	if(x<-2) y=x-1/sqrt(1+2*sin(x)*sin(x));
	else if(x<1) y=1+1/(x*x+sin(2*x));
	else y=sqrt(abs(3-x*x*x))+cos(x*x);
	cout<<y<<endl;
}

阶乘和数

【问题描述】

一个正整数如果等于组成它的各位数字的阶乘之和,则该正整数称为阶乘和数。例如正整数145,1!+4!+5!等于145,因此145就是一个阶乘和数。输入一个正整数,计算它的各位数字的阶乘之和,并判断它是否是一个阶乘和数。注意:输入的正整数,以及组成它的各位数字的阶乘之和都不会超过int类型的表示范围,并且输入的正整数的最高位不为0。

【输入形式】

从控制台输入一个正整数。

【输出形式】

第一行输出各位数字的阶乘之和;第二行输出字符串“yes”或“no”,表明该正整数是否是阶乘和数。

【输入样例1】

145

【输出样例1】

145

yes

【输入样例2】

1400

【输出样例2】

27

no

【输入样例3】

4

【输出样例3】

24

no

【样例说明】

样例1中输入的正整数为145,组成它的各位数字的阶乘之和为145,所以145为阶乘和数。样例2中输入的正整数为1400,组成它的各位数字的阶乘之和为25,所以1400不是阶乘和数。样例3中输入的正整数为4,组成它的只有一位数字,其阶乘为24,也不是阶乘和数。

思路

先拆分数字,再计算阶乘,最后求和

#include
using namespace std;
int main()
{
	int n,jc,sum=0,t;
	cin>>n;
	t=n;
	while(t)
	{
		jc=1;
		for(int i=2;i<=t%10;i++)
			jc*=i;
		sum+=jc;
		t/=10;
	}
	cout<<sum<<endl;
	sum==n?cout<<"yes"<<endl:cout<<"no"<<endl;
}

数组元素调整顺序

【问题描述】
输入n个数存放到数组a中,把数组a中的最大值放在b[0]中,把a数组中的最小值放在b[1]中;再把a数组元素中的次大值放在b[2]中,把a数组元素中的次小值放在b[3]中;其余以此类推。例如:若a所指数组中的数据最初排列为:1、4、2、3、9、6、5、8、7,则按规则移动后,b数组数据排列为: 9、1、8、2、7、3、6、4、5。其中n为a数组中数据的个数。

【输入形式】
输入分2行:第一行为n的值,第二行为n个数

【输出形式】
输出排列后的结果

【样例输入】

9

1 4 2 3 9 6 5 8 7

【样例输出】

9 1 8 2 7 3 6 4 5

思路

观察。

每隔一个放一个,奇数项单调递减,偶数项单调递增

本人采用了一种比较麻烦的方法。对于偶数项而言,通过计算,发现了原下标x和新下标y有这样的关系:

y=-2x+2n-1

然后就写了思考量相对大的代码

#include
using namespace std;
const int N=100002;
int a[N],b[N],n;
int main()
{
	cin>>n;
	for(int i=0;i<n;i++) cin>>a[i];
	for(int i=0;i<n;i++)
		for(int j=i;j<n;j++)
			if(a[i]<a[j])
				swap(a[i],a[j]);
	for(int i=0;i<(n+1)/2;i++)
	 b[2*i]=a[i];
	for(int i=(n+1)/2;i<n;i++)
		b[(-2)*i+(2*n-1)]=a[i];
	for(int i=0;i<n;i++) cout<<b[i]<<" ";
}

然后又有大佬提供了一个更简单的代码,思考量也小。以下是大佬的程序:

大学电子系C++模拟考试_第2张图片

十六进制转十进制

【问题描述】
编写程序,输入一个十六进制的数,如果输入的不是十六进制,则输出NO,否则输出对应的十进制值。 注:十六进制数由0-9、A-F(字母大小写不限)组成,其中A-F代表10-15;十六进制转成十进制的方法是按权展开法,即每一位上的数值乘以该位的权值,最后相加。比如1A2b,共4位数,每一位的权值(从高位到低位)分别为16的三次方、16的二次方、16的一次方、16的零次方,各位上的数字乘以该位的权值即为116的三次方+1016的二次方+216的一次方+1116的零次方,转换结果为6699

【输入形式】
一个字符串

【输出形式】
一个整型数

【样例输入1】
1A2b

【样例输出1】
6699

【样例输入2】
15G9

【样例输出2】
NO

思路

先判断数字是否合法,字母是否用A~F,再利用位权进行运算。

我想吐槽,这个测试平台添加了cstring头文件还是用不了strupr和strlwr

#include
#include
using namespace std;
const int N=100002;
char c[N];
int main()
{
	cin>>c;
	for(int i=0;i<strlen(c);i++)
		if((c[i]>='0'&&c[i]<='9')||(c[i]>='A'&&c[i]<='F')||(c[i]>='a'&&c[i]<='f')) continue;
		else
		{
			cout<<"NO";
			return 0;
		}
	long long sum=0,num,wq=1;
	for(int i=strlen(c)-1;i>=0;i--)
	{
		if(c[i]>='0'&&c[i]<='9')
			num=c[i]-'0';
		else switch(c[i])
		{
		case 'A':case 'a':num=10;break;
			case 'B':case 'b':num=11;break;
			case 'C':case 'c':num=12;break;
			case 'D':case 'd':num=13;break;
			case 'E':case 'e':num=14;break;
			case 'F':case 'f':num=15;break;
		}
		sum+=num*wq;
		wq*=16;
	}
	cout<<sum<<endl;
}

大佬的更简洁的程序如下:

大学电子系C++模拟考试_第3张图片

最大数与第一个数交换

【问题描述】
编写函数,功能是将数组中的最大数与第一个数交换,并计算数组元素的平均值。例如输入5个元素3、4、1、5、2,将最大数5和第一个数3的位置交换后得到5、4、1、3、2,平均值为3。要求输入输出均在主函数中完成。

【输入形式】
输入分两行,第一行为n的值,第二行为n个数

【输出形式】
输出分两行,第一行为交换后数组n个元素的值,第二行为平均值。

【样例输入】

5

5 3 2 1 7

【样例输出】

7 3 2 1 5

3.6

思路

写函数,交换,求平均。

我的程序有点繁琐,就是找最大的时候把最大值也用一个变量保存了下来。

#include
#include
using namespace std;
const int N=100002;
double fun(int n,int f[])
{
	int maxx=-1,maxp=0,sum=0;
	for(int i=0;i<n;i++)
	{
		sum+=f[i];
		if(f[i]>maxx)
		{
			maxx=f[i];
			maxp=i;
		}
	}
	swap(f[0],f[maxp]);
	return (double)sum/n;
}
int main()
{
	int a[N],n;
	cin>>n;
	for(int i=0;i<n;i++) cin>>a[i];
	double ave=fun(n,a);
	for(int i=0;i<n;i++) cout<<a[i]<<" ";
	cout<<endl<<ave;
}

其实没有问最大值,那就只要知道下标就行了,下面这也是一个大佬的程序,更简洁。

#include
using namespace std;
double han(int a[],int n)
{
	int i,max=0,t;
	double b=0;
	for(i=0;i<n;i++)
		b=b+a[i];
		b=b*1.0/n;
	for(i=0;i<n;i++)
	{
		if(a[i]>a[max])
		{
			max=i;
		}
		t=a[max];
		a[max]=a[0];
		a[0]=t;
	}
		return b;
}
int main()
{
	int a[999],n,i;
	double s;
	cin>>n;
	for(i=0;i<n;i++)
		cin>>a[i];
	s=han(a,n);
	for(i=0;i<n;i++)
		cout<<a[i]<<" ";
	cout<<endl<<s;
	return 0;
}
#include
using namespace std;
double han(int a[],int n)
{
	int i,max=0,t;
	double b=0;
	for(i=0;i<n;i++)
		b=b+a[i];
		b=b*1.0/n;
	for(i=0;i<n;i++)
	{
		if(a[i]>a[max])
		{
			max=i;
		}
		t=a[max];
		a[max]=a[0];
		a[0]=t;
	}
		return b;
}
int main()
{
	int a[999],n,i;
	double s;
	cin>>n;
	for(i=0;i<n;i++)
		cin>>a[i];
	s=han(a,n);
	for(i=0;i<n;i++)
		cout<<a[i]<<" ";
	cout<<endl<<s;
	return 0;
}
#include
using namespace std;
double han(int a[],int n)
{
	int i,max=0,t;
	double b=0;
	for(i=0;i<n;i++)
		b=b+a[i];
		b=b*1.0/n;
	for(i=0;i<n;i++)
	{
		if(a[i]>a[max])
		{
			max=i;
		}
		t=a[max];
		a[max]=a[0];
		a[0]=t;
	}
		return b;
}
int main()
{
	int a[999],n,i;
	double s;
	cin>>n;
	for(i=0;i<n;i++)
		cin>>a[i];
	s=han(a,n);
	for(i=0;i<n;i++)
		cout<<a[i]<<" ";
	cout<<endl<<s;
	return 0;
}

#include
using namespace std;
double han(int a[],int n)
{
	int i,max=0,t;
	double b=0;
	for(i=0;i<n;i++)
		b=b+a[i];
		b=b*1.0/n;
	for(i=0;i<n;i++)
	{
		if(a[i]>a[max])
		{
			max=i;
		}
		t=a[max];
		a[max]=a[0];
		a[0]=t;
	}
		return b;
}
int main()
{
	int a[999],n,i;
	double s;
	cin>>n;
	for(i=0;i<n;i++)
		cin>>a[i];
	s=han(a,n);
	for(i=0;i<n;i++)
		cout<<a[i]<<" ";
	cout<<endl<<s;
	return 0;
}

#include
using namespace std;
double han(int a[],int n)
{
	int i,max=0,t;
	double b=0;
	for(i=0;i<n;i++)
		b=b+a[i];
		b=b*1.0/n;
	for(i=0;i<n;i++)
	{
		if(a[i]>a[max])
		{
			max=i;
		}
	}
		t=a[max];
		a[max]=a[0];
		a[0]=t;
		return b;
}
int main()
{
	int a[999],n,i;
	double s;
	cin>>n;
	for(i=0;i<n;i++)
		cin>>a[i];
	s=han(a,n);
	for(i=0;i<n;i++)
		cout<<a[i]<<" ";
	cout<<endl<<s;
	return 0;
}

最后,祝大家都能取得令人满意的成绩!

留下点赞或者评论再走呗~

你可能感兴趣的:(大学电子系C++,c++)