中南大学(CSU)2023级期中考试

CSU23级机试

  • 问题 A: 个税计算(20分)
  • 问题 B: 时制转换(20分)
  • 问题 C: 统计进位(20分)
  • 问题 D: 平面魔方(20分)
  • 问题 E: 三角形塔(10分)
  • 问题 F: 生日礼物(10分)

问题 A: 个税计算(20分)

小南毕业工作了,他想知道自己每年的扣税情况。他查到的综合所得的个人所得税税率表如下:
级数
全年应纳税所得额
税率(%)
速算扣除数
1
不超过36000元的部分
3
0
2
超过36000-144000元的部分
10
2520
3
超过144000-300000元的部分
20
16920
4
超过300000-420000元的部分
25
31920
5
超过420000-660000元的部分
30
52920
6
超过660000-960000元的部分
35
85920
7
超过960000元的部分
45
181920
你能根据小南的收入算出他每年所要缴纳的税款吗?
输入
多个样例。每个样例输入一个整数m(104≤m≤107)代表小南的年终收入,为100的整数倍。
输出
每个样例输出一个整数,表示小南缴纳的个税。每个样例输出结果占一行。
样例输入 Copy
20000
36000
400000
660000
样例输出 Copy
600
1080
68080
145080

//#include
//int main()
//{
//	long long m;
//	while (~scanf("%lld", &m))
//	{
//		long long sum = 0;
//		if (m >= 36000)
//		{
//			sum += 360 * 3;
//		}
//		else if(m<36000)
//		{
//			sum += m / 100 * 3;
//		}
//		if (m >= 144000)
//		{
//			sum += (144000 - 36000) / 100 * 10;
//		}
//		else if(m>36000)
//		{
//			sum += (m - 36000) / 100 * 10;
//		}
//		if (m >= 300000)
//		{
//			sum += (300000 - 144000) / 100 * 20;
//		}
//		else if (m >144000)
//		{
//			sum += (m - 144000) / 100 * 20;
//		}
//		if (m >= 420000)
//		{
//			sum += (420000 - 300000) / 100 * 25;
//		}
//		else if (m >300000)
//		{
//			sum += (m - 300000) / 100 * 25;
//		}
//		if (m >=660000 )
//		{
//			sum += (660000 - 420000) / 100 * 30;
//		}
//		else if (m >420000)
//		{
//			sum += (m - 420000) / 100 * 30;
//		}
//		if (m >= 960000)
//		{
//			sum += (960000 - 660000) / 100 * 35;
//		}
//		else if (m > 660000)
//		{
//			sum += (m - 660000) / 100 * 35;
//		}
//		if (m > 960000)
//		{
//			sum += (m - 960000) / 100 * 45;
//		}
//		printf("%lld\n", sum);
//	}
//	return 0;
//}

问题 B: 时制转换(20分)

[命题人 : 外部导入]
时间限制 : 1.000 sec 内存限制 : 128 MB

题目描述
12小时制和24小时制都是一种记录时间的方式,两者的区别在于:
(1)12小时制是把一天二十四小时分为上午和下午两个十二小时的时间段,上午从午夜12:00到上午11:59,后缀标记am或者AM,下午从正午12:00到晚上11:59,后缀标记pm或者PM。
(2)24小时制是把一天二十四个小时从午夜开始用00:00~23:59表示。
(3)使用12小时制显示时间时中午12点显示为12:00 pm或者12:00 PM,而将午夜显示为12:00 am或者12:00 AM。
小南的任务:将12小时制格式显示的时间转换为24小时制格式显示。
输入
多个样例。每个样例输入1行形式为hh:mmcd的数据,其中整数hh(00≤hh≤12)代表小时,整数mm(00≤mm≤59)代表分钟,cd是字母组合“am、AM、pm、PM”中的一个,分别表示上午(am或AM)和下午(pm或者PM)。
输出
每个样例输出新的24小时制格式的时间,形式为hh:mm。每个样例输出结果占一行。
样例输入 Copy
12:00am
12:59PM
11:09pm
03:02AM
04:18PM
样例输出 Copy
00:00
12:59
23:09
03:02
16:18

//#include
//int main(void)
//{
//	int hh, mm, h, m;
//	char a, s;
//	while (~scanf("%d:%d%c%c", &hh, &mm, &a, &s))
//	{
//		if (a == 'a'||a=='A')
//		{
//			h = hh % 12;
//			m = mm;
//		}
//		else
//		{
//			if (hh == 12)
//				h=hh;
//			else
//			h = hh + 12;
//			m = mm;
//		}
//		printf("%.2d:%.2d\n", h, m);
//	}
//	return 0;
//}

问题 C: 统计进位(20分)

[命题人 : 外部导入]
时间限制 : 1.000 sec 内存限制 : 128 MB

题目描述
老师发现很多学生在进行加法的时候,发现“进位”特别容易出错。于是交给小南一个任务,就是统计两个整数x和y在相加时需要多少次进位,其中x和y满足0≤x,y≤ 109,你能帮他完成任务吗?
输入
多个样例。 每个样例输入1行,包括2个整数x和y(0≤x,y≤ 109)。
输出

每个样例输出一个整数,代表所需要的进位数。每个样例输出结果占一行。

样例输入 Copy
8 7
9 0
154 246
555 5555
123 594
样例输出 Copy
1
0
2
3
1

//#include
//int main()
//{
//	long long x, y;
//	while (~scanf("%lld %lld", &x, &y))
//	{
//		long sum = 0;
//		int weihe = 0;
//		while (x || y)
//		{
//			weihe += x % 10 + y % 10;
//			if (weihe>= 10)
//			{
//				sum++;
//				weihe = 1;
//			}
//			else
//			{
//				weihe = 0;
//			}
//			x /= 10; y /= 10;
//		}
//		printf("%ld\n", sum);
//	}
//	return 0;
//}

问题 D: 平面魔方(20分)

[命题人 : 外部导入]
时间限制 : 1.000 sec 内存限制 : 128 MB

题目描述
小南最近喜欢上了魔方,设计了一个平面魔方。平面魔方是一个n×n(2≤n≤ 10)的矩阵,最开始用数据1~n2填充。魔方的操作指令集如下:
(1)指令1:“L x y”表示矩阵的第x行循环左移y次;
(2)指令2:“R x y”表示矩阵的第x行循环右移y次;
(3)指令3:“U x y”表示矩阵的第x列循环上移y次;
(4)指令4:“D x y”表示矩阵的第x列循环下移y次;
其中矩阵的行号和列号x从1开始编号,满足1≤x≤n;移动次数y满足1≤y≤n−1。
说明:5个数据a1,a2,a3,a4,a5循环左移1次会变成a2,a3,a4,a5,a1。
要求:对给定的初始魔方,经过若干次操作后形成新的魔方,按行将新魔方的所有数字输出在一行上,数字之间用一个空格分开,行首和行末无空格。
输入
多个样例。每个样例输入包含1+m行:
第1行输入两个整数n(2≤n≤10)和m(1≤m≤100),分别表示矩阵的大小和指令的条数。
接下来的m行是m条指令,输入格式为“C x y”,字母C(L或R或U或D)代表移动的方向,整数x(1≤x≤n)代表移动的行或列号,y(1≤y≤n−1)代表移动次数。
输出
对于每个样例,按行输出新魔方的所有数字。每个样例结果输出占一行。
样例输入 Copy
3 1
L 1 1
3 1
R 1 1
3 1
U 1 1
3 1
D 1 1
4 3
L 3 1
U 2 2
R 4 3
样例输出 Copy
2 3 1 4 5 6 7 8 9
3 1 2 4 5 6 7 8 9
4 2 3 7 5 6 1 8 9
7 2 3 1 5 6 4 8 9
1 11 3 4 5 14 7 8 10 2 12 9 6 15 16 13

//#include
//int main(void)
//{
//	int n, m;
//	while (~scanf("%d %d", &n, &m))
//	{
//		int juzheng[10][10] = { 0 }; int mm = 0;
//		int* p = (&(juzheng[0][0]));
//		for (int i = 0; i <= n - 1; i++)
//		{
//			for (int j = 0; j <= n - 1; j++)
//			{
//				juzheng[i][j] = (++mm);
//			}
//		}
//		for (int zhiling = 1; zhiling <= m; zhiling++)
//		{
//			char lrud; int roworcol; int ci;
//			scanf(" %c %d %d", &lrud, &roworcol, &ci);
//			{
//				roworcol--;
//				if (lrud == 'L')
//				{
//					while (ci--)
//					{
//						int temp = juzheng[roworcol][0];
//						for (int ccc = 0; ccc <= n - 2; ccc++)
//						{
//							juzheng[roworcol][ccc] = juzheng[roworcol][ccc + 1];
//						}
//						juzheng[roworcol][n - 1] = temp;
//					}
//				}
//				else if (lrud == 'R')
//				{
//					while (ci--)
//					{
//						int temp = juzheng[roworcol][n - 1];
//						for (int ccc = n - 1; ccc > 0; ccc--)
//						{
//							juzheng[roworcol][ccc] = juzheng[roworcol][ccc - 1];
//						}
//						juzheng[roworcol][0] = temp;
//					}
//				}
//				else if (lrud == 'U')
//				{
//					while (ci--)
//					{
//						int temp = juzheng[0][roworcol];
//
//						for (int ccc = 0; ccc <= n - 2; ccc++)
//						{
//							juzheng[ccc][roworcol] = juzheng[ccc + 1][roworcol];
//						}
//						juzheng[n - 1][roworcol] = temp;
//					}
//				}
//				else if (lrud == 'D')
//				{
//					while (ci--)
//					{
//						int temp = juzheng[n - 1][roworcol];
//						for (int ccc = n - 1; ccc > 0; ccc--)
//						{
//							juzheng[ccc][roworcol] = juzheng[ccc - 1][roworcol];
//						}
//						juzheng[0][roworcol] = temp;
//					}
//				}
//			}
//		}
//		for (int i = 0; i <= n - 1; i++)
//		{
//			for (int j = 0; j <= n - 1; j++)
//			{
//				if(j!=n-1||i!=n-1)
//				printf("%d ", juzheng[i][j]);
//				else
//					printf("%d\n", juzheng[i][j]);
//			}
//			
//		}
//	}
//}

问题 E: 三角形塔(10分)

[命题人 : 外部导入]
时间限制 : 1.000 sec 内存限制 : 128 MB

题目描述
小南想要绘制一个金字塔。金字塔的图案由正三角形和倒三角形堆叠而成,共计n个。具体的绘制方法如下:
(1)每个三角形由*,/,\和-组成,分别代表三角形的顶点和三条边。
(2)第一行只包含一个正三角形,其余各行的三角形按照“正三角形、倒三角形、正三角形、倒三角形,……”的顺序排列。
(3)除最后一行外,每一行的三角形比上一行多2个。
例如,不同的n值对应的图案如下:

金字塔中三角形的个数n定为多少好呢?小南想到一个有趣的斐波那契数列(Fibonacci sequence),其值从第0项开始依次为1,1,2,3,5,8,13,21,34,55,89,…。小南让老师给出一个正整数x,然后在斐波那契数列中找到不小于x的最小的斐波那契数对应的位置作为n,你能根据老师给出的x,帮小南编写程序绘制出相应的金字塔图案吗?(说明:斐波那契数列中1的位置为1,2的位置为2,3的位置为3,5 的位置为4,以此类推。)

输入
多个样例。每个样例输入一个正整数x(1≤x≤105),表示老师给出的正整数。
输出
对于每个样例输出对应的图案,注意每行的末尾没有多余的空格。
样例输入 Copy
1
2
3
15
样例输出 Copy
*
/

*
/

/

*
/

/ \ /

*
/

/ \ /
—*
/ \ /
—*

#include
#include
int findnum(int);
int arr[50] = { 1,1 };
int main(void)
{
	for (int i = 2; i <= 49; i++){
		arr[i] = arr[i - 1] + arr[i - 2];
	}
	int x;
	while (~scanf("%d", &x))
	{
		int num = findnum(x);
		int guanghangshu = (int)(sqrt(num ));
		//diyihang
		int extra = num - guanghangshu * guanghangshu;
		if (extra == 0)  guanghangshu--;
		for (int i = 1; i <= 2 * (guanghangshu+1); i++)
		{
			printf(" ");
		}
		printf("*");
		printf("\n");
		for (int i = guanghangshu; i >= 1; i--)
		{
			for (int m = 1; m <= 2 * i; m++)
			{
				printf(" ");
			}
			int b = guanghangshu - i + 1;
			int ff = b;
			while (b--)
			{
				printf(" / \\");
			}
			printf("\n");
			for (int m = 1; m <= 2 * i ; m++)
			{
				printf(" ");
			}
			while (ff--)
			{
				printf("*---");
			}
			printf("*");
			printf("\n");
		}
		extra = num - guanghangshu * guanghangshu;
		int temp = extra;
		if (extra >= 1)
		{
			printf(" /");
			for (int i = 1; i <= extra; i++)
			{
				if (i % 2 == 1)
					printf(" \\");
				else
					printf(" /");
			}
			printf("\n");
			extra = (extra + 1) / 2;
			while (extra--)
			{
				printf("*---");
			}
				printf("*");
				printf("\n");
		}
	}
}

int findnum(int num)
{
	int i = 1;
	for (; arr[i] <num; i++)
		;
	return i;
}

格式错误可能是前面或者后面多输出了空格或者换行符。
写程序脑子要清晰,考虑所有情况

问题 F: 生日礼物(10分)

[命题人 : 外部导入]
时间限制 : 1.000 sec 内存限制 : 128 MB

题目描述
小南想要同学们送一幅数字画作为生日礼物,他给你一块画布(600X600)并设定了以下规则来让你画数字画:
(1)将画布用数字0填充。
(2)在画布中间位置的某个点(x0,y0)开始绘制一个边数为n的逆时钟螺旋线,一开始方向向右,边长依次为第i个素数(i=1,2,3,…,n),即2,3,5,7,11,…。使用数字1表示横线,数字2表示竖线。
(3)画完后按照螺旋线边界裁掉多余的画布形成一个矩形数字画。例如,当n为5时,相应的数字画为:

要求:对于给定的n(1≤n≤50),输出最终的数字画。

输入
多个样例。 每个样例输入一行包含一个n(1≤n≤50),表示数字画中逆时钟螺旋线的边数。
输出
每个样例按照要求输出一个正确的矩阵图形。每两个样例的输出结果之间用一个空行分开。
样例输入 Copy
1
2
3
样例输出 Copy
11

02
02
02
11

111112
000002
000002
000011

int huabu[1000][1000] = { 0 };
#include
int main(void)
{
	int prime[51] = { 0 ,2 }; int m = 0,flag=1;
	for ( int i = 2; m<50; i++)
	{
		flag = 1;
		for (int x = 2; x * x <= i; x++)
		{
			if (i % x == 0)
			{
				flag = 0;
				break;
			}
		}
		if (flag)
			prime[++m] = i;
	}
	int n;
	while (~scanf("%d", &n))
	{
		int x = 500, y = 499;
		huabu[500][500] = 1;
		for (int i = 1; i <= n; i++)
		{
			if (i % 4 == 1)
			{
				for (int ci = 1; ci <= prime[i]; ci++)
				{
					huabu[x][++y] = 1;
				}
			}
			else if(i%4==2)
			{
				for (int ci = 1; ci <= prime[i]; ci++)
				{
					huabu[--x][y] = 2;
				}
			}
			else if (i % 4 == 3)
			{
				for (int ci = 1; ci <= prime[i]; ci++)
				{
					huabu[x][--y] = 1;
				}
			}
			else if (i % 4 == 0)
			{
				for (int ci = 1; ci <= prime[i]; ci++)
				{
					huabu[++x][y] = 2;
				}
			}
		}

		int rowstart, rowend;
		int colstart, colend;
		if (n == 1)
		{
			printf("11\n\n");
			continue;
		}
		else if (n == 2)
		{
			printf("02\n02\n02\n11\n\n");
			continue;
		}
		if (n % 4 == 1)
		{
			rowstart = x - prime[n-1];
			rowend = x;
			colend = y;
			colstart = y - prime[n];
		}
		else if (n % 4 == 2)
		{
			rowstart= x;
			rowend = x + prime[n ];
			colend = y ;
			colstart = y-prime[n-1];
		}
		else if (n % 4 == 3)
		{
			rowend = x + prime[n-1];
			rowstart = x;
			colend = y+prime[n] ;
			colstart = y;
		}
		else
		{
			rowend = x;
			rowstart = x - prime[n ];
			colstart = y ;
			colend = y+prime[n-1];
		}
		for (int s = rowstart; s <= rowend; s++)
		{
			for (int a = colstart; a <= colend; a++)
			{
				printf("%d", huabu[s][a]);
			}
			printf("\n");
		}
		printf("\n");
	}
	return 0;
}

这个ac的相当心虚。样例可能给的全是先给小数,再给大数。也可以进行改正,比如每次进入循环之前,先置0将整个数组。
局部变量数组设置的不大可设置为全局变量。

你可能感兴趣的:(CSU,c语言)