复试机试准备(自用)
创始人
2024-06-03 00:36:58

机试准备(洛谷)

作为一个输出过程,自己看看

还剩10天

题目描述

输入两个整数 �,�a,b,输出它们的和(∣�∣,∣�∣≤109∣a∣,∣b∣≤109)。

注意

  1. Pascal 使用 integer 会爆掉哦!
  2. 有负数哦!
  3. C/C++ 的 main 函数必须是 int 类型,而且 C 最后要 return 0。这不仅对洛谷其他题目有效,而且也是 NOIP/CSP/NOI 比赛的要求!

我的题解

#include 
using namespace std;//为了不加前缀名
int main() {int a, b;cin >> a >> b;cout << a + b;return 0;
}
#include 
int main() {int a, b;scanf("%d%d", a, b);printf("%d", a + b);return 0;
}

题目2

//c++
#include 
using namespace std;
//第一种方法就是讲元看成10
int main() {int a, b;cin >> a >> b;cout << ((a * 10) + b )/( 19);return 0;
}
//c
#define _CRT_SECURE_NO_WARNINGS
#include 
int main() {int a,b;scanf("%d %d", &a, &b);printf("%d", (a * 10 + b)/ (19));return 0;
}

题目描述(错了一次复习)

[P1422 小玉P1422 小玉家的电费 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)家的电费 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)](https://www.luogu.com.cn/problem/P1422#submit)

我的题解

#include 
#include 
using namespace std;int main() {int sum;cin >> sum;cout << fixed << setprecision(1);//保留小数点后一位if (sum <= 150) cout << sum * 0.4463;else if ( sum <=400) cout << 150 * 0.4463 + (sum - 150) * 0.4663;else cout << 150 * 0.4463 + 250 * 0.4663 + (sum - 400) * 0.5663;}

/C语言

//c
#define _CRT_SECURE_NO_WARNINGS
#include int main() {int sum;scanf("%d",&sum);if (sum <= 150) printf("%.1f", sum * 0.4463) ;else if (sum <= 400) printf("%.1f", 150 * 0.4463 + (sum - 150) * 0.4663) ;else printf("%.1f", 150 * 0.4463 + 250 * 0.4663 + (sum - 400) * 0.5663) ;
}

思路

%用法

1 要输出float a=1.23234; 保留3位小数的写法为:
printf(“%.3f”,a);
2 输出double b=123.345232; 保留4为小数,写法为:
printf(“%.4lf”,b);

题目描述

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7MH08Cxo-1678635540235)(C:\Users\达芬奇\AppData\Roaming\Typora\typora-user-images\image-20230306000340152.png)]

我的题解

int main() {int a, b, c;for (a = 0; a <= 9; a++) {for (b = 0; b <= 9; b++) {for (c = 0; c <= 9; c++) {if ((a * 100 + b * 10 + c) + (b * 100 + c * 10 + c) == 532)printf("%d %d %d", a, b, c);}}}
}

题目描述

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0gsuyK3Y-1678635540236)(C:\Users\达芬奇\AppData\Roaming\Typora\typora-user-images\image-20230306023408982.png)]

我的思路:

int main() {int a, b, c, d,sum;for (a = 0; a <= 9; ++a) {for (b = 0; b < +9; ++b) {for (c = 0; c <= 9; ++c) {for (d = 0; d <= 9; ++d) {sum = a * 1000 + b * 100 + c * 10 + d;if (sum * 9 == (d * 1000 + c * 100 + b * 10 + a)) {if(sum>=1000)printf("%d\n", sum);}}}}}
}

王道用的是求余!!值得学习%%%%

题目描述

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-a8oj7vb2-1678635540236)(C:\Users\达芬奇\AppData\Roaming\Typora\typora-user-images\image-20230306030002374.png)]

我的题解:

int Reverse(int i) {int k = i * i;if (k < 10) {return k;}if (10int m = k % 10;//个位int n = k/10;//十位if (m == n) {return k;}}if (1000 > k&&k> 100) {int a = k % 10;int b = k / 100;if (a == b) {return k;}}if (k > 1000&&k<10000) {int a = k % 10;int b = k / 10 % 10;//十位int c = k / 100 % 10;//百位int d = k / 1000;//千位if ((a == d) && (b == c)) {return k;}}if (k > 10000 ) {int a = k % 10;int b = k / 10 % 10;//十位int c = k / 100 % 10;//百位int d = k / 1000%10;//千位int e = k / 10000;if ((a == e) && (b ==d)) {return k;}}return 0;
}
int main() {//本质上还是求的是逆序数//首先小于10肯定是int i=0;//再去找对称的数while (i<= 256) {if (Reverse(i) == i * i) {printf("%d\n", i);}i++;}
}

不得不说很久不巧写的方法比较笨==

还剩9天

模拟问题

题目描述

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OhQqXc7P-1678635540237)(C:\Users\达芬奇\AppData\Roaming\Typora\typora-user-images\image-20230306162133904.png)]

我的题解

int main() {printf("请输入一个整数\n");int n,h;scanf("%d", &h);int m = h,k;int H = h + (h - 1) * 3;for (h; h > 0; --h) {n = H - m;k = m;for (n; n > 0; --n) {printf(" ");}for (k; k >0;k-- ) {printf("*");}m += 2;printf("\n");}
}
//第一行为h的话,那么高度为h,即最底部的长度应该是
//H=h+(h-1)*3;

王道解法

int main() {int h;while (scanf("%d", &h) != EOF) {for (int i = 0; i < h; ++i) {for (int j = 0; j < 2 * h - 2 - 2 * i; ++j) {printf(" ");}for (int j = 0; j < h + 2 * i; ++j) {printf("*");}printf("\n");}}
}

使用二维数组去解决模拟问题

char arr[3000][1000];
int main() {//用二维数组来模拟//第一步:填空int h;while (scanf("%d", &h)!= EOF) {for (int i = 0; i < h; i++) {for (int j = 0; j < 3 * h - 2; j++) {arr[i][j] = ' ';}}//填充完空格开始放星星int m = h - 1;int k =0;for (m; m >= 0; m--) {for (int n=k ; n<= 3 * h - 2;++n) {arr[m][n] = '*';}k += 2;}//打印for (int i = 0; i < h; i++) {for (int j = 0; j < 3 * h - 2; j++) {printf("%c",arr[i][j]);}printf("\n");}}
}

c风格的字符串设计

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BV0REEMG-1678635540237)(C:\Users\达芬奇\AppData\Roaming\Typora\typora-user-images\image-20230306172043262.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pGbPmDMc-1678635540238)(C:\Users\达芬奇\AppData\Roaming\Typora\typora-user-images\image-20230306172233290.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NM3eLDF7-1678635540238)(C:\Users\达芬奇\AppData\Roaming\Typora\typora-user-images\image-20230306172328511.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-W5jrP8CU-1678635540238)(C:\Users\达芬奇\AppData\Roaming\Typora\typora-user-images\image-20230306172740950.png)]

题目描述(错题)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zmqRpElS-1678635540239)(C:\Users\达芬奇\AppData\Roaming\Typora\typora-user-images\image-20230306182210168.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ca2IIKZI-1678635540239)(C:\Users\达芬奇\AppData\Roaming\Typora\typora-user-images\image-20230306193242901.png)]

我的题解

错了看了王道解法,记得在markji上去背

int main() {int n;//外框长度char inner, outter;printf("请输入长度以及内外花色\n");bool flag = true;while (scanf("%d %c %c", &n, &inner, &outter) != EOF) {if (flag == true) {flag = false;}else{printf("\n");}char pattern[80][80] = { 0 };//方便最后以字符串的形式输出int length = 1;//一开始的外框长度int x, y;//坐标char changchar = inner;for (length = 1, x = n / 2, y = n / 2; length <= n; length = length + 2,--x,--y) {//填满周围的正方形for (int i = x, j = y; i < x + length; i++) {pattern[i][j] = changchar;}//左上横线for (int i = x, j = y; j < y + length; j++) {pattern[i][j] = changchar;}//左下横线for (int i = x + length - 1, j = y; j < y + length; j++) {pattern[i][j] = changchar;}//右边竖线for (int i = x, j = y + length - 1; i < x + length; ++i) {pattern[i][j] = changchar;}//做个翻转符号if (changchar == inner) {changchar = outter;}else{changchar = inner;}}//去四角if (n != 1) {pattern[0][0] = ' ';pattern[n - 1][0] = ' ';pattern[0][n - 1] = ' ';pattern[n - 1][n - 1] = ' ';}//输出图形for (int i = 0; i < n; i++) {printf("%s\n", pattern[i]);}}
}

8天-排序

必须掌握的库函数-sort()

//关键代码
//c++引入
//头文件
#include 
using namespace std;

头文件cstdio

#include 
/*作用:是C语言标准库中的一个头文件,其全称为"C Standard Input and Output Library"。这个库提供了用于执行输入输出操作的函数。其中包括常用的输入函数scanf()、getchar(),以及输出函数printf()、putchar()等。这些函数可以让程序员在C语言中进行标准输入输出,从而读写文件、屏幕、键盘等设备。在C语言中,可以用预处理指令“#include ”来引入。一旦引入了这个头文件,就可以在程序中使用库提供的函数。库函数的使用非常方便,而且效率高。因此,它是C语言程序员经常使用的一个标准库之一。由于C++是基于C语言的,所以在C++中也可以使用库中的函数。但是在C++中,建议使用iostream库进行输入输出操作,因为iostream库比更安全、更易于使用。
*/

using name space 作用解释

在C++中,using namespace std;是一个常用的语句,它的作用是告诉编译器使用std命名空间中的符号。std是C++标准库中许多类和函数所在的命名空间,如果不使用using namespace std语句,那么就需要使用std::来引用这些类和函数,例如std::cout、std::cin等。 使用using namespace std语句可以省略代码中的std::前缀,从而使代码更加简洁易读,但需要注意的是,这样做也会有一些潜在的问题,例如可能会引发命名冲突等问题。因此,一些C++编程规范建议尽可能不要在头文件中使用using namespace std;,而是在具体的源文件中使用。另外,也可以选择只使用需要的部分命名空间,例如using std::cout;只引入std命名空间中的cout符号,而不是整个std命名空间。 总之,using namespace std语句可以简化C++代码的编写,提高代码的可读性,但需要注意一些潜在的问题,并根据实际情况灵活使用。

sort用法实例

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3LzETv0w-1678635540239)(C:\Users\达芬奇\AppData\Roaming\Typora\typora-user-images\image-20230312143313541.png)]

#include 
#include 
using namespace std;int main(){int n;//要输入的数字while(scanf("%d",&n)!=EOF){int arr[101];//要输入的数字for (int i = 0; i < n; ++i){//一次输入数字同时放入数组scanf("%d",&arr[i]);}//对数组进行排序sort(arr,arr+n);//输出for (int i = 0; i < n; ++i){printf("%d",arr[i]);}}
}

注意点:

arr【i】和arr+i

其实表达意思是完全一样的

arr【i】表示的arr数组中第i号元素的具体值是多少

arr+i表达的意思是arr第i号元素的地址哦

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OJ6yrOLJ-1678635540240)(C:\Users\达芬奇\AppData\Roaming\Typora\typora-user-images\image-20230312144815703.png)]

注意end是尾巴后一个元素的位置

如何设计其排序的规则

默认的排序是升序排序

sort(start,end,compare)//加上一个参数即为compare参数

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8mkErHDS-1678635540240)(C:\Users\达芬奇\AppData\Roaming\Typora\typora-user-images\image-20230312145831814.png)]

using namespace std;bool compare(int lhs,int rhs){if(lhs>rhs){return true;}else{return false;}//也可以写成 return lhs>rhs//不发生交换时候返回真
}
int main(){int arr[8];for (int i = 0; i < 8; ++i) {scanf("%d",arr+i);}sort(arr,arr+8,compare);for (int i = 0; i < 8; ++i) {printf("%d",arr[i]);}
}

第一题

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kx914wzC-1678635540240)(C:\Users\达芬奇\AppData\Roaming\Typora\typora-user-images\image-20230312181633384.png)]

我的题解

#include 
#include 
using namespace std;
bool comp(int i,int j){//返回true不交换两个元素/*第一种情况:左奇数右边偶数不交换*/if(i%2==1&&j%2==0){return true;}else if(i%2==1&&j%2==1&&i>j){//第二种就是判断奇数如果左边大右边小不交换return true;}else if(i%2==0&&j%2==0&&i

第二题

致命错误(第一次写的时候编译错误记录)

使用了变长数组(Variable Length Arrays,VLA),即使用了变量n来定义了一个可以放入n个学生对象的数组students。在C++11标准之前,这种定义数组的方式是不合法的,导致代码可移植性不好,编译器的实现也不稳定。因此,应该使用常量或者宏定义来定义数组的长度,例如使用 #define MAX_STUDENT_NUM 100 来定义数组的最大长度

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JqEMl4P6-1678635540241)(C:\Users\达芬奇\AppData\Roaming\Typora\typora-user-images\image-20230312192346582.png)]

我的题解

#include 
#include 
#define MAX_STUDENT_NUM 100
using namespace std;
struct Student{int stuNum;int stuGrade;
};
bool compare(Student lhs,Student rhs){
/*成绩从小到大,排序不变也就是true* 若成绩相同,学号大小从小到大*/if(lhs.stuGrade

第三题

重要技巧:

由于sort底层(快速排序)其实本身并不是稳定的故我们需要自己去设置一个变量,来令其稳定

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MkqaAkHy-1678635540241)(C:\Users\达芬奇\AppData\Roaming\Typora\typora-user-images\image-20230312194125321.png)]

我的题解

#include 
#include 
using namespace std;
#define MAX_STUDENT_NUM 100
struct Student{char name[100];int score;//成绩int seq;//保证其有序
};
//升序排序参数
bool upper(Student lhs,Student rhs){if(lhs.scorerhs.seq){//相同成绩先录入在前return true;}else{return false;}
}
//降序排序参数
bool down(Student lhs,Student rhs){if(lhs.score>rhs.score){return true;} else if (lhs.score==rhs.score&&lhs.seq>rhs.seq){//相同成绩先录入在前return true;} else{return false;}
}
int main(){Student students[MAX_STUDENT_NUM];int n,order;//排序人数和排序方法while (scanf("%d%d",&n,&order)!=EOF){//依次输入学生信息int seq;for (int i = 0; i < n; ++i) {seq=0;scanf("%s%d",&students[i].name,&students[i].score);students[i].seq=seq;seq++;}//开始分析是低到高还是告到底if(order==1){//升序的情况sort(students,students+n, upper);//输出值printf("从高到低 成绩\n");for (int i = 0; i < n; ++i) {printf("%s %d\n",students[i].name,students[i].score);}}//降序的情况if(order==0){sort(students,students+n, down);printf("从低到高 成绩\n");for (int i = 0; i < n; ++i) {printf("%s %d\n",students[i].name,students[i].score);}}}
}

第四题

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Oto9TD2s-1678635540241)(C:\Users\达芬奇\AppData\Roaming\Typora\typora-user-images\image-20230312204056028.png)]

我的题解

#include 
using namespace std;int main(){//首先是输入一个数nint n;int arr[201];scanf("%d",&n);for (int i = 0; i < n; ++i){scanf("%d",&arr[i]);}int x;scanf("%d",&x);int i;for ( i = 0; i < n; ++i){if(arr[i]==x){printf("%d\n",i);break;}}if(i==n){//说明没有这个玩意printf("-1\n");}
}

遇到多个数据的时候最好的方式是排序+二分查找哦

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SssNUojp-1678635540242)(C:\Users\达芬奇\AppData\Roaming\Typora\typora-user-images\image-20230312204949484.png)]

容易出现的问题是

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-n4u1q1No-1678635540242)(C:\Users\达芬奇\AppData\Roaming\Typora\typora-user-images\image-20230312205154151.png)]

用map解决查找问题

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-f13bdNmY-1678635540242)(C:\Users\达芬奇\AppData\Roaming\Typora\typora-user-images\image-20230312231325674.png)]

做题前瞻

常用方法名-find()

在C++中,std::map是一种关联式容器,它将键映射到值。我们可以使用map中的find方法来查找容器中是否存在某个指定的键。 find函数的具体作用为:在map中查找键值等于指定键值的元素,如果能够找到,则返回指向该元素的迭代器;如果查找失败,则返回指向容器尾部的迭代器。

函数的形式为: c++ iterator map::find(const key_type& key); const_iterator map::find(const key_type& key) const; 其中,key为要查找的键值,如果map中存在该键,则返回指向该元素的迭代器;否则返回指向容器尾部的迭代器。

下面是一个使用std::map::find函数的例子:

c++ #include #include int main() { std::map m; m["Alice"] = 90; m["Bob"] = 80; m["Charlie"] = 70; auto it = m.find("Alice"); if (it != m.end()) { std::cout << "Alice's score is " << it->second << std::endl; } else { std::cout << "Alice is not found" << std::endl; } it = m.find("David"); if (it != m.end()) { std::cout << "David's score is " << it->second << std::endl; } else { std::cout << "David is not found" << std::endl; } return 0; }

在这个例子中,我们定义了一个std::map对象m,它将学生的姓名映射到他们的成绩。我们首先向m中添加了三个元素,然后使用find函数查找m中是否存在某个指定的键。第一个查找"Alice",由于这个键存在于m中,因此find函数返回指向该元素的迭代器,并输出对应的成绩。第二个查找"David",由于这个键不存在于m中,因此find函数返回指向容器尾部的迭代器,并输出一个提示信息。

find()常常会和end()配合使用

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sdGl6wcI-1678635540242)(C:\Users\达芬奇\AppData\Roaming\Typora\typora-user-images\image-20230312233708280.png)]

#include 
#include 
using namespace std;
int main(){map findIndex;int m,n;int arr[101];while (scanf("%d",&n)!=EOF){for (int i = 0; i < n; ++i){scanf("%d",&arr[i]);findIndex[arr[i]]=i;//将数组元素作为建,数组元素下标作为值}scanf("%d",&m);for (int i = 0; i < m; ++i){int findnum;//带查找元素scanf("%d",&findnum);if(findIndex.find(findnum)!=findIndex.end()){printf("NO\n");} else{printf("YES\n");}}}
}

相关内容

热门资讯

嵌入式LPDDR4X价格全面大... 格隆汇1月13日|据闪存市场,当前,除少数原厂针对个别应用端客户以临时报价出货外,普遍仍处于新季度配...
2026年多只“大牛股”狂刷屏... 本报(chinatimes.net.cn)记者谢碧鹭 北京报道2026年开年以来,A股市场呈现出鲜明...
黄金价格屡创新高 交易所、银行... 转自:新华财经新华财经北京1月13日电(记者 王小璐)开年以来,国际金价继续走出上扬行情,1月12日...
三峡旅游:2025年四季度收到... 转自:证券时报人民财讯1月13日电,三峡旅游(002627)1月13日公告,公司及所属子公司自202...
伊朗国际长途电话服务恢复但不稳... 转自:证券时报人民财讯1月13日电,新华社驻德黑兰记者13日证实,伊朗境内国际长途电话服务当天恢复。...