精工书院2022级-C语言编程机考模拟练习课堂
好吧虽然我说不写,但最后还是写了
可怜可怜孩子,点个赞吧,往年这种文章可都是收费的(手动滑稽)
【机考模拟01】输出字符图形
编写程序,从键盘输入一个n和字符,然后用输入的字符,输出相应图形。例如:
输入:5,#<回车>
输出:
#####<回车>
#####<回车>
#####<回车>
#####<回车>
#####<回车>
#include <stdio.h>
int main()
{
int n;
char x;
scanf("%d,%c",&n,&x);
for(int i = 0; i < n; i ++)
{
for(int j = 1; j < n - i; j ++) printf(" ");
for(int j = 0; j < n; j ++) putchar(x);
printf("\n");
}
}
【机考模拟02】偶数分解
素数是指一个只能被1和它本身整除的数。
编写程序,从键盘输入一个偶数,将它分解为两个素数之和。
- 列出所有的分解方式,每种方式占一行;
- 较小的素数放在前面。 例如:
输入
22<回车>
输出
22=3+19<回车>
22=5+17<回车>
22=11+11<回车>
#include <stdio.h>
int isp(int n)
{
if(n%6==1||n%6==5)
{
for(int i = 4;i < n;i ++)
{
if(n%i==0) return 0;
}
return 1;
}
else if(n == 2||n == 3) return 1;
else return 0;
}
int main()
{
int n,a;
scanf("%d",&n);
for(a = 2;a <= n/2 ;a ++)
{
if(isp(a)&&isp(n-a))
printf("%d=%d+%d\n",n,a,n-a);
}
}
如果是面对更大的数据或者多组询问,可以先预处理出全部素数(范围内)
【机考模拟03】组成最大数
编写程序,从键盘任意输入一个自然数(不超过2030位),然后输出由该自然数的各位数字组成的最大数。
例如,输入 2018 ,则输出 8210 。
计数排序即可,之前讲过【字符】组成最大数
#include <stdio.h>
int num[10],x;
int main(){
while((x = getchar())!='\n') num[x - '0'] ++;
for(int i = 9;i >= 0;i --) while(num[i]--) printf("%d",i);
printf("\n");
return 0;
}
【机考模拟04】计算日期差
编写程序,从键盘输入两个日期,然后输出两个日期相差的天数。第二个日期比第一个日期大时,结果为正;否则为负。
两个日期的输入格式均为: YYYY-MM-DD 。有效日期:1000-01-01 至 2080-12-31 。
输入:2018-01-01,2018-02-02<回车>
输出:32<回车>
也讲过【日期】计算天数
#include <stdio.h>
int a[15] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
int day(int y, int m, int d)
{
if (y % 4 == 0 && y % 100 != 0 || y % 400 == 0) a[2] = 29;
else a[2] = 28;
int i, s;
for (i = 1; i <= m - 1; i++) { d += a[i]; }
s = 365 * (y - 1) + (y - 1) / 4 - (y - 1) / 100 + (y - 1) / 400 + d;
return s;
}
main()
{
int y1, y2, m1, m2, d1, d2;
scanf("%d-%d-%d,%d-%d-%d", &y1, &m1, &d1, &y2, &m2, &d2);
printf("%d\n", day(y2, m2, d2) - day(y1, m1, d1));
}
【机考模拟05】打印数字菱形
输入 n 的值,输出如下例( n=4 )所示的数字菱形。
4
434
43234
4321234
43234
434
4
输入:
n
输出:
数字菱形
#include <bits/stdc++.h>
using namespace std;
int main()
{
int num;
scanf("%d",&num);
for(int i = num - 1;i + num > 0;i--)
{
for(int j = 0;j < abs(i);j++) printf(" ");
for(int j = num - 1 - abs(i);j >= abs(i) + 1 - num;j--) printf("%-2d",abs(i) + 1 + abs(j));
printf("\n");
}
}
【机考模拟06】计算后续日期
我们经常要计算,从今天往后N天之后是哪一天(哪年哪月哪日)。现在我们就可以编写一个程序,推算指定日期之后的第N天是什么日期。
输入:
年 月 日
N
输出:
(年月日+N天后的)年.月.日
只能说一模一样【日期】计算后续日期
【机考模拟07】寻找阿姆斯特朗数
请编写一个程序寻找一种特殊整数:一个 n 位的正整数等于其各位数字的n次方之和。
例如:407=4×4×4+0×0×0+7×7×7。所以407就是一个特殊数。
输入:
正整数的位数n(n<=6)。
输出:
所有此n位特殊数。每个数占一行。若不存在符合条件的特殊数,则输出提示:“No output.”;若存在,则从小到大进行输出。
说明:
假设输入为4,在4位整数中,有3个4位的特殊数,则输出格式为(输出中的1111、2222和9999并不是4位特殊数,只是格式样例):
1111
2222
9999
again,一模一样【中学】寻找阿姆斯特朗数
【机考模拟08】汉字字库存储多少
汉字的点阵字库有1616,2424,36*36等各种粒度不一的编码方式,数字越大,表示点阵越精细,汉字形体越细致。
根据汉字点阵的编码方式,计算若干个汉字需要的存储空间。
输入:m n
m代表汉字字形码的点阵位数(即m*m) n代表汉字个数
输出:占据的Byte数
输入:
16 1(含义为,16*16的汉字点阵编码,1个汉字)
输出:
32(含义为Byte数)
纯计算题
#include <stdio.h>
main()
{
int m,n;
scanf("%d%d",&m,&n);
printf("%d\n",m*m*n/8);
}
【机考模拟09】合并字符串
输入两个已经按从小到大顺序排列好的字符串,编写一个合并两个字符串的函数,使合并后的字符串,仍然是从小到 大排列。
输入:
两个已经排好顺序(升序)的两个字符串
输出:
一个合并在一起的有序(升序)的字符串
要求:
设计一个效率尽量高的算法,对每个字符串只扫描一遍就可以了。
如果采用先进行串连接,然后再进行排序的算法,则效率太低了。
归并排序,老演员了【字符】合并字符串
【机考模拟10】求最大公约数——递归
辗转相除法,一样【约数】求最大公约数——递归