当前位置: 首页 > news >正文

C++进阶(while循环——函数应用)

知识点+代码框架总结

输入n组数据 ,对n组数据里面的每一组进行处理(输出、求和 、运算、其他)

int n;//几组数据cin >> n;//2while(n--){//对每组数据进行处理}看到下面的样例,肌肉型反映出上面的框架//2// 1 2 3// 4 5 6

若干组输入框架

int a; //方法一
while ( cin >> a ) {//不断地读入cout << a << " ";
}int a; //方法二
while (scanf("%d", &a) == 1) {//当scanf接收到一个数据时(返回值为1)cout << a << " ";
}int a; //方法三
while (scanf("%d", &a) != EOF) {//结束的时候返回EOF cout << a << " ";
}

对数字拆分的框架

int t = i;//拆分后肯定为0,不影响上面的for循环的进行,故使用t作为临时变量while (t)//对t进行拆分{                         // 345 345% 10=5 34%10 = 4cout << t % 10;//输出每一位 5 4 3 t = t / 10; // 345/10=34 34/10=3}

对于一维数组的框架


#include <bits/stdc++.h>
#include <vector>using namespace std;int main()
{int arr[100];//第一步:对arr数组里面的元素进行赋值for(int i = 1;i <= n;i++){cin >> arr[i];//arr[1]  arr[2]...arr[n]}//第二步:对数组遍历+题目要求 dofor(int i = 1;i <= n;i++){//题目要求进行填写主要内容}//第三步:根据要求是否要打印数组里面的这些值for(int i = 1;i <= n;i++){cout <<  arr[i] <<  " ";}return 0;
}

删除数组中第K个元素(位置为k)


for(int i = k + 1;i <= n;i++){a[i-1] = a[i];}

区间翻转的代码框架


for(int i = l,j=r;i < j;i++,j--){//交换a[i] a[j]的位置swap(a[i),a[j]);
}

二维数组的框架


#include <bits/stdc++.h>
#include <vector>using namespace std;int main()
{int a[505][505] = { }; //假如数据范围是500int n, m;        // n行 m列//输入二维数组for (int i = 1; i <= n; i++){for (int j = 1; j <= m; j++){cin >> a[i][j];}}//根据题意去干什么事情 —— to dofor (int i = 1; i <= n; i++){for (int j = 1; j <= m; j++){//根据题意 to do  }}// 输出二维数组(根据题意)for (int i = 1; i <= n; i++){for (int j = 1; j <= m; j++){cout << a[i][j] << " ";}cout << endl;}return 0;
}

字符数组以及字符串函数

在这里插入图片描述

经典例题

计算A+B(4) —— 掌握若干组数据输入的框架

输入包含多个测试用例,一个用例一行。每种情况都以一个整数n开头,然后n个整数跟在同一行中。(数据均在int范围内)样例输入:4 1 2 3 4
5 1 2 3 4 5样例输出:10
15**代码**#include <bits/stdc++.h>
#include <vector>using namespace std;int main()
{int n;while (cin >> n ){int res = 0;for (int i = 0; i < n; i++){int num;cin >> num;res = res + num;}cout << res << endl;}return 0;
}

土仙花数——掌握数字拆分

定义土仙花数为各个数位乘积与该数本身的差的绝对值不超过 k 的数。
**样例输入1**10 1**样例输出1**9代码:
#include <bits/stdc++.h>
#include <vector>using namespace std;int main()
{int n, k, count = 0; // count记录个数cin >> n >> k;       // 10 1for (int i = 1; i <= n; i++){int t = i, sum = 1;while (t){sum *= t % 10;t /= 10;}if (abs(sum - i) <= k)count++;}cout << count << endl;return 0;
}

打印分数——掌握一维数组的框架


输入n个成绩,打印出所有低于平均分的分数
#### Input 13 40 50 60
2 90 80
5 10 10 90 80 80#### Output 140
80
10 10代码:
#include <bits/stdc++.h>
#include <vector>using namespace std;int main()
{int arr[110], n;while (cin >> n){int sum = 0;for (int i = 1; i <= n; i++){cin >> arr[i];sum = sum + arr[i];}for (int i = 1; i <= n; i++){double p = sum * 1.0 / n;if (arr[i] < p)cout << arr[i] << " ";}cout << endl;}return 0;
}

删除某个数——掌握删除框架

对于给定长度为n的数列,删除指定位置上的数。
代码:
#include <bits/stdc++.h>
#include <vector>using namespace std;int main()
{int n, m;cin >> n >> m; // 5 3int arr[1005];for (int i = 1; i <= n; i++){cin >> arr[i]; // 1 2 3 4 5}// 1 2 3 4 5//for (int i = m + 1; i <= n; i++){arr[i - 1] = arr[i]; // a[4]}for (int i = 1; i < n; i++){cout << arr[i] << " ";}return 0;
}

区间翻转——掌握区间翻转

有一个长为n的数列,共有m次操作。每次操作会翻转一个区间l到r。问最终序列?
#### **输入格式:**第一行一个整数n,表示序列中的元素个数。第二行n个整数,表示原序列。第三行一个整数m,表示翻转次数。接下来m行每行两个整数l,r。#### **输出格式:**一行n个整数,表示最终序列。#### **样例输入:**3
1 2 3 
1
1 2#### **样例输出:**2 1 3
代码:
#include <bits/stdc++.h>
#include <vector>using namespace std;int main()
{int n;cin >> n; // 3int arr[1005];for (int i = 1; i <= n; i++){cin >> arr[i]; // 1 2 3}int m;cin >> m; //翻转的次数 1 3for (int i = 1; i <= m; i++){int l, r;cin >> l >> r;//翻转for(倒着不遍历l到r的区间){//把该区间的元素存入到临时数组t中,//每存入一个元素,数组t的有效长度增加1}for(正着遍历l到r的区间){//用数组t中的有效元素进行替换该区间数组a的元素}}for (int i = 1; i <= n; i++){cout << arr[i] << " ";}return 0;
}

拔苗助长——掌握模拟的过程

**输入格式:**第一行输入一个整数n,表示秧苗的数量。第二行输入n个数,表示每株秧苗的初始高度。第三行输入一个整数m,表示农夫拔苗的天数。接下来m行每行三个整数a,b,c,表示将第 a 株苗到第 b 株苗全部拔高 c 的高度#### **输出格式:**输出一行,包含�n个整数,以空格隔开,表示秧苗最终的高度#### **样例输入:**4
1 2 3 4
3
1 2 1
2 3 1
4 4 1#### **样例输出:**2 4 4 5代码:
#include <bits/stdc++.h>
#include <vector>using namespace std;int main()
{int n;cin >> n; //操作的次数 4int arr[1001];for (int i = 1; i <= n; i++){cin >> arr[i]; //苗的初试状态  1 2 3 4}int m;cin >> m; //操作的次数for (int i = 1; i <= m; i++){int l, r, h;cin >> l >> r >> h;for (int j = l; j <= r; j++){arr[j] = arr[j] + h;}}for (int i = 1; i <= n; i++){cout << arr[i] << " ";}return 0;
}

计算矩阵边缘元素之和——掌握二维数组的框架+总结规律


#### Input 13 3
3 4 1
3 7 1
2 0 1#### Output 115## 代码:```C++
#include <bits/stdc++.h>
#include <vector>using namespace std;int main()
{int n, m;cin >> n >> m;int a[105][105];int sum = 0;for (int i = 0; i < n; i++){for (int j = 0; j < m; j++){cin >> a[i][j];}}for (int i = 0; i < n; i++){for (int j = 0; j < m; j++){if (i == 0 || i == n - 1 || j == 0 || j == m - 1){sum = sum + a[i][j];}}}cout << sum << endl;return 0;
}

蹦蹦炸弹——把8个方向的坐标写成两个一维数组进行遍历


#### Input 15 5
6 8 9 8 7 
9 9 6 6 5 
7 9 7 6 7 
5 7 7 8 7 
8 7 9 6 8#### Output 126 39 37 33 19
39 61 62 55 34
39 57 58 53 32
38 59 59 57 35
19 36 35 39 21### 数据范围1<=1001<=n,m<=100## 代码:```C++
#include <bits/stdc++.h>
#include <vector>using namespace std;int main()
{int n, m, a[105][105] = {};int dx[8] = {-1, 1, 0, 0, -1, -1, 1, 1};int dy[8] = {0, 0, -1, 1, -1, 1, -1, 1};int sum[105][105] = {};cin >> n >> m;for (int i = 1; i <= n; i++){for (int j = 1; j <= m; j++){cin >> a[i][j];}}for (int i = 1; i <= n; i++){for (int j = 1; j <= m; j++){// to dofor (int k = 0; k < 8; k++){int xx = dx[k] + i;int yy = dy[k] + j;sum[i][j] += a[xx][yy];}}}for (int i = 1; i <= n; i++){for (int j = 1; j <= m; j++){cout << sum[i][j] << " ";}cout << endl;}return 0;
}

友好数对——二维数组全部赋值为-1,避免重复


### 题目描述读入一个n*m的矩阵,定义两个数是友好的,当且仅当他们位置相邻(上下左右)且值相同。求友好数对个数。### 输入格式第一行两个整数n,m  
之后n行,每行m个0100间的整数### 输出格式一个整数,表示答案。### 样例#### Input 15 4
3 3 3 4
2 0 0 3
0 3 1 4
3 4 3 3
1 0 3 3#### Output 17### 样例解释测试样例解释:  
对于样例输入1,共有7对友好数字,分别是:  
(1,1)(1,2),  
(1,2)(1,3),  
(2,2)(2,3),  
(4,3)(4,4),  
(4,3)(5,3),  
(4,4)(5,4),  
(5,3)(5,4)。### 数据范围1<=n,m<=500## 代码:```C++
#include <bits/stdc++.h>
#include <vector>using namespace std;int main()
{int n, m;cin >> n >> m;int cnt = 0; //记录个数int a[505][505]={};for (int i = 1; i <= 504; i++){for (int j = 1; j <= 504; j++){a[i][j] = -1;}}for (int i = 1; i <= n; i++){for (int j = 1; j <= m; j++){cin >> a[i][j];}}for (int i = 1; i <= n; i++){for (int j = 1; j <= m; j++){if (a[i][j] == a[i][j + 1]){cnt++;}if (a[i][j] == a[i + 1][j]){cnt++;}}}cout << cnt << endl;return 0;
}

字母转换——基础必须掌握


样例输入:q样例输出:Q## 代码:```C++
#include <bits/stdc++.h>
#include <vector>using namespace std;int main()
{char ch;cin >> ch;cout << char(ch - 32);return 0;
}

字符串的大小关系——掌握strcmp()函数


### **输入格式**输入共两行,每行一个无空格的字符串,分别表示两个需要比较大小的字符串s1和字符串s2。### **输出格式**共两行,第一行输出字典序小的字符串,第二行输出字典序大的字符串。### **样例输入**abd
abc### **样例输出**`abc` abd### **数据范围与提示**保证输入字符串长度不超过100## 代码:```C++#include <bits/stdc++.h>
#include <vector>using namespace std;int main()
{//定义字符数组a bchar a[105], b[105];//输入这两个字符串cin >> a >> b;int t;t = strcmp(a, b); //赋值给字符串比较函数if (t < 0){cout << a << endl << b;//输出小的 在输出大的}else{//输出小的 在输出大的cout << b << endl << a;}return 0;
}

验证子串——掌握strlen()函数以及strstr()函数


【题目描述】输入两个字符串,验证其中一个串是否为另一个串的子串。【数据格式】输入两个字符串, 每个字符串占一行,长度不超过200且不含空格。若第一个串s1是第二个串s2的子串,则输出(s1) is substring of (s2)否则,若第二个串s2是第一个串s1的子串,输出(s2) is substring of (s1)否则,输出 No substring。样例输入:abc
dddncabca样例输出:abc is substring of dddncabca## 代码:```C++
#include <bits/stdc++.h>
#include <vector>using namespace std;int main()
{char s1[205], s2[205];cin >> s1 >> s2;int len1 = strlen(s1); // 3int len2 = strlen(s2); // 9if (strstr(s2, s1) != NULL && (len1 < len2)){cout << s1 << " "<< "is substring of" <<" "<< s2;}else if (strstr(s1, s2) != NULL && (len1 > len2)){cout << s2 << " "<< "is substring of"<< " " << s1;}else{cout << "No substring" << endl;}return 0;
}

输出特殊字符串——掌握转义字符


**样例输出1**He said:"The symbol is '\'".**约定:****提示:**## 代码:```C++
#include <bits/stdc++.h>
#include <vector>using namespace std;int main()
{cout << "He said:";cout << "\"The symbol is '\\'\".";return 0;
}

统计数字字符个数——基础必须掌握


### 样例#### Input 1Peking University is set up at 1898.#### Output 14## 代码:```C++
#include <bits/stdc++.h>
#include <vector>using namespace std;int main()
{string a;getline(cin, a);int len = 0;len = a.size();int cnt = 0;for (int i = 0; i < len; i++){if (a[i] >= '0' && a[i] <= '9'){cnt++;}}cout << cnt << endl;return 0;
}

验证子串2——掌握字符型数字的比较:长度+字典序


### 输入格式输入一行,包含两个数字字符串,两个字符串之间用空格隔开。### 输出格式输出两行:  
第一行两个字符串用空格隔开,分别是“大”字符串和“小”字符串;  
第二行输出"YES""NO",表示后者是否为前者的子串。### 样例#### Input 112345678912345 12345678912345#### Output 112345678912345 12345678912345
YES#### Input 212345 123456789 #### Output 2123456789 12345 
YES#### Input 312345 223456789 #### Output 3223456789 12345 
NO### 数据范围1<=字符串长度<=10001<=字符串长度<=1000  
单个数字字符串不包含空格。## 代码:```C++
#include <bits/stdc++.h>
#include <vector>using namespace std;int main()
{string a, b;cin >> a >> b;if (a.size() > b.size() || a.size() == b.size() && a > b){cout << a << " " << b << endl;int pos = a.find(b);if (pos > 0)cout << "YES";elsecout << "NO" << endl;}else{cout << b << " " << a << " " << endl;int pos = b.find(a);if (pos != string::npos)cout << "YES" << endl;elsecout << "NO" << endl;}return 0;
}

身份证信息——掌握substr()分割字符串函数


### 题目描述18位身份证号意义如下:  
11-2位:各省级政府的代码;  
23-4位:地、市级政府代码;  
35-6位:县、区级政府代码;  
47-10位:持证人出生年份;  
511-121:持证人出生月份;  
613-14位:持证人出生当月日期;  
715-17位:持证人在当地的顺序码,性别等,其中奇数为男、偶数为女;  
8、第18位:校验码。现在有n个人向你填报了自己的身份证号,你能找出其中年纪最大的是第几位吗?  
按输入顺序编号。如果有出生年月日都相同的,就输出最靠前的一位的序号。### 输入格式输入n+1行:  
第一行一个整数n,  
接下来n+1行,每行一个18位的身份证号。### 输出格式输出年纪最大的人的编号。### 样例#### Input 13
410181199707240021
410181200511250012
411181199707250352#### Output 11
代码:
#include <bits/stdc++.h>
#include <vector>using namespace std;int main()
{int n;cin >> n;string s[10005], s1, elderstr;elderstr = "99999999";int maxage = 0;for (int i = 0; i < n; i++){cin >> s[i];s1 = s[i].substr(6, 8);if (elderstr > s1){elderstr = s1;maxage = i + 1;}}cout << maxage << endl;return 0;
}

卡牌收集Plus——字符串与数字进行绑定


**输入格式:** 第一行两个整数n,m。n表示卡牌的总数,m表示有m次询问;接下去n行,每行一个字符串和一个整数,表示卡牌的名称和攻击力;最后一行,有m个以空格间隔的字符串,依序表示询问的卡牌名称。**输出格式:**仅一行,以空格间隔的m个整数,按照询问顺序输出结果。**样例输入:**2 2
Luffy 1200
Zoro 1100
Zoro Luffy**样例输出:**1100 1200```C++
#include <bits/stdc++.h>
#include <vector>using namespace std;int main()
{int n, m;cin >> n >> m; // n卡牌总数 m询问次数string s[2005];int a[2005];for (int i = 0; i < n; i++){cin >> s[i] >> a[i];}string x;while (m--){cin >> x; //字符串for (int i = 0; i < n; i++){if (s[i] == x){cout << a[i] << " ";}}}return 0;
}

判断字符串是否为回文——必须掌握


### 题目描述输入一个字符串,输出该字符串是否回文。回文是指顺读和倒读都一样的字符串。### 输入格式输入为一行字符串(字符串中没有空白字符,字符串长度不超过100)。### 输出格式如果字符串是回文,输出yes;否则,输出no。### 样例#### Input 1abcdedcba#### Output 1yes## 代码:```C++
方法一:
#include <bits/stdc++.h>
#include <vector>using namespace std;int main()
{string s;cin >> s;for (int x = 0, y = s.size() - 1; x <= y; x++, y--){if (s[x] != s[y]){cout << "no" << endl;return 0;}}cout << "yes";return 0;
}

方法二:

#include <bits/stdc++.h>
#include <vector>using namespace std;int main()
{string s, ss;cin >> s;ss = s;reverse(s.begin(), s.end());if (s == ss){cout << "yes" << endl;}else{cout << "no" << endl;}return 0;
}

凯撒加密简单版——掌握


在古罗马,“高卢战争”描述了凯撒使用加密来传递信息,即所谓的“凯撒加密”,这是一种替代加密。消息中的每个字母都被其后面的第t个字母替换。例如,当t=4时,加密规则是用原始字母后的第4个字母替换原始字母, 字母“a”后的第四个字母是“e”,而“a”被“e”取代,字母“z”后的第四个字母是“d”,而“z”被“d”取代。因此,“china”将被翻译成“glmre”。请编写一个程序来加密输入的字符串,方法是将每个字母替换为后面的第t个字母。输入格式:输入一个字符串并输入t输出格式:标题中描述了输出格式。示例输入1:china 4样本输出1:glmre示例输入2:antdzyo 30样本输出2:erxhdcs规定:输入的字符串长度不超过100,只包含小写字母。t<=260## 代码:```C++
#include <bits/stdc++.h>
#include <vector>using namespace std;int main()
{string s;int t;cin >> s >> t;t = t % 26;int num = s.size();for (int i = 0; i < num; i++){if (s[i] + t > 'z'){s[i] = (s[i] + t) % 'z' + 'a' - 1;}else{s[i] += t;}}cout << s;return 0;
}

最大公约数和最小公倍数——基础必须掌握两个函数


#include <bits/stdc++.h>
#include <vector>using namespace std;int fun1(int a, int b)
{//最大公约数return __gcd(a, b);
}
int fun2(int a, int b)
{//最小公倍数return a * b / __gcd(a, b);
}int main()
{int a, b;cin >> a >> b;int c, d;c = fun1(a, b);d = fun2(a, b);cout << c << endl << d;return 0;
}

绝对素数——基础必须掌握思路(考察函数的使用)


### 题目描述如果一个自然数是素数,且它的数字位置经过对换后仍为素数,则称为绝对素数,例如13。试求出所有二位绝对素数。### 输入格式无### 输出格式所有二位绝对素数(由小到大,一个数一行)。### 样例#### Input 1无#### Output 1无## 代码:```C++
#include <bits/stdc++.h>
#include <vector>using namespace std;bool prime(int x)
{for (int i = 2; i < sqrt(x); i++){if (x % i == 0)return false;}return true;
}int main()
{for (int i = 10; i < 100; i++){if (prime(i) && prime(i % 10 * 10 + i / 10))cout << i << endl;}return 0;
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 通过vm可以访问那些属性——06
  • 整洁架构SOLID-接口隔离原则(ISP)
  • WSGI 服务器教程:`full_dispatch_request` 方法解析
  • Flutter框架时间线梳理
  • 同三维T80004EA编解码器视频使用操作说明书:高清HDMI编解码器,高清SDI编解码器,4K超清HDMI编解码器,双路4K超高清编解码器
  • SpringBoot整合Java Mail实现发送邮件
  • Study--Oracle-07-ASM自动存储管理(一)
  • GLM3源码学习
  • 《斯科特·凯尔比的风光摄影手册》读书笔记
  • 刷题之单词规律同构字符串(leetcode)
  • 2022-10-26 Qt6.5版本后视频渲染
  • Go 初始化一个字典value是列表
  • 前端/python脚本/转换-使用天地图下载的geojson(echarts4+如果直接使用会导致坐标和其他信息不全)
  • MongoDB - 查询操作符:比较查询、逻辑查询、元素查询、数组查询
  • 安全防御----防火墙综合实验2
  • [NodeJS] 关于Buffer
  • 5、React组件事件详解
  • Android优雅地处理按钮重复点击
  • go语言学习初探(一)
  • HomeBrew常规使用教程
  • HTML5新特性总结
  • Java 11 发布计划来了,已确定 3个 新特性!!
  • Just for fun——迅速写完快速排序
  • 创建一个Struts2项目maven 方式
  • 技术胖1-4季视频复习— (看视频笔记)
  • 如何解决微信端直接跳WAP端
  • 使用前端开发工具包WijmoJS - 创建自定义DropDownTree控件(包含源代码)
  • 由插件封装引出的一丢丢思考
  • No resource identifier found for attribute,RxJava之zip操作符
  • 测评:对于写作的人来说,Markdown是你最好的朋友 ...
  • ​软考-高级-系统架构设计师教程(清华第2版)【第20章 系统架构设计师论文写作要点(P717~728)-思维导图】​
  • $$$$GB2312-80区位编码表$$$$
  • $.ajax()方法详解
  • (CPU/GPU)粒子继承贴图颜色发射
  • (done) 两个矩阵 “相似” 是什么意思?
  • (k8s)Kubernetes本地存储接入
  • (LeetCode C++)盛最多水的容器
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (动态规划)5. 最长回文子串 java解决
  • (函数)颠倒字符串顺序(C语言)
  • (解决办法)ASP.NET导出Excel,打开时提示“您尝试打开文件'XXX.xls'的格式与文件扩展名指定文件不一致
  • (每日一问)基础知识:堆与栈的区别
  • (推荐)叮当——中文语音对话机器人
  • (转)Sublime Text3配置Lua运行环境
  • (转)淘淘商城系列——使用Spring来管理Redis单机版和集群版
  • ***测试-HTTP方法
  • .NET CORE 3.1 集成JWT鉴权和授权2
  • .NET 中使用 Mutex 进行跨越进程边界的同步
  • .NET+WPF 桌面快速启动工具 GeekDesk
  • //TODO 注释的作用
  • @converter 只能用mysql吗_python-MySQLConverter对象没有mysql-connector属性’...
  • [100天算法】-每个元音包含偶数次的最长子字符串(day 53)
  • [APIO2012] 派遣 dispatching
  • [AutoSar]状态管理(五)Dcm与BswM、EcuM的复位实现
  • [C#]OpenCvSharp 实现Bitmap和Mat的格式相互转换