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

C++练习备忘录

1. 保留两位小数输出格式

在这里插入图片描述

#include <iostream>
#include <iomanip>
using namespace std;
int main()
{double S = 0;S = (15 + 25) * 20 / 2;cout << fixed << setprecision(2) << S;return 0;
}

2. 设置输出宽度

在这里插入图片描述

#include <iostream>
#include <iomanip>
using namespace std;
int main()
{int a, b, c;cin >> a >> b >> c;cout << setw(8) << a << " ";cout << setw(8) << b << " ";cout << setw(8) << c;return 0;
}

3. ASCII码转换

在这里插入图片描述

#include <iostream>
#include <iomanip>
using namespace std;
int main()
{char a;cin >> a;cout << int(a);return 0;
}

4. 高精度加法

在这里插入图片描述

#include <iostream>
using namespace std;// 字符型转整型
void strtoint(string src, int des[]) {for (int i = 0;i < src.size();i++) {//从[1]开始倒序存整型数字,使得个位对齐des[src.size() - i] = src[i] - '0'; }
}int main()
{	string s1, s2;int a[201] = {0};int b[201] = {0};int ans[201] = {0};cin >> s1 >> s2;/* 字符型转整型,通过反转使得个位对齐s1: 1234s2: 567序列号:01234a:  4321b:  765*/strtoint(s1, a);strtoint(s2, b);// 计算ans数组长度,按最长位+1int a_size = s1.size(), b_size = s2.size();int ans_size = max(a_size, b_size) + 1;// 对位相加得到ans数组for (int i = 1;i <= ans_size;i++) {ans[i] = a[i] + b[i] + ans[i]; // a+b+进位ans[i + 1] = ans[i] / 10; // 进位ans[i] %= 10; // 留个位数}// 去除前导0while (ans[ans_size] == 0 && ans_size > 1)ans_size--;// 倒序打印得最后结果for (int i = ans_size;i >= 1;i--)cout << ans[i];return 0;
}

5. 高精度减法

在这里插入图片描述
这里多加了一下a和b大小的判别

#include <iostream>
using namespace std;// 字符型转整型
void strtoint(string src, int des[]) {for (int i = 0;i < src.size();i++) {//从[1]开始倒序存整型数字,使得个位对齐des[src.size() - i] = src[i] - '0';}
}// 比较字符串输入数的大小
bool cmpstring(string str1, string str2) {if (str1.size() != str2.size())return str1.size() > str2.size();elsereturn str1 >= str2;
}int main()
{string s1, s2;int a[201] = { 0 };int b[201] = { 0 };int ans[201] = { 0 };cin >> s1 >> s2;// 保证大数减小数if (cmpstring(s1, s2) == false) {swap(s1, s2);cout << "-";}/* 字符型转整型,通过反转使得个位对齐s1: 1234s2: 567序列号:01234a:  4321b:  765*/strtoint(s1, a);strtoint(s2, b);// 计算ans数组长度int a_size = s1.size(), b_size = s2.size();int ans_size = max(a_size, b_size);// 对位相减得到ans数组for (int i = 1;i <= ans_size;i++) {// 判断够不够减if (a[i] < b[i]) {a[i + 1]--;a[i] += 10;}ans[i] = a[i] - b[i];}// 去除前导0while (ans[ans_size] == 0 && ans_size > 1)ans_size--;// 倒序打印得最后结果for (int i = ans_size;i >= 1;i--)cout << ans[i];return 0;
}

6. 高精度乘法

在这里插入图片描述

#include <iostream>
using namespace std;// 字符型转整型
void strtoint(string src, int des[]) {for (int i = 0;i < src.size();i++) {//从[1]开始倒序存整型数字,使得个位对齐des[src.size() - i] = src[i] - '0';}
}int main()
{string s1, s2;int a[101] = { 0 };int b[101] = { 0 };int ans[201] = { 0 };cin >> s1 >> s2;strtoint(s1, a);strtoint(s2, b);// 计算ans数组长度int a_size = s1.size(), b_size = s2.size();int ans_size = a_size + b_size;/*序列号:5	 4	  3	   2	  1a4b1 a3b1 a2b1  a1b1a4b2	a3b2 a2b2 a1b2得:ans[i + j - 1] += a[i] * b[j]*/for (int i = 1;i <= a_size;i++) {for (int j = 1;j <= b_size;j++) {ans[i + j - 1] += a[i] * b[j];ans[i + j] += ans[i + j - 1] / 10;ans[i + j - 1] %= 10;}}// 去除前导0while (ans[ans_size] == 0 && ans_size > 1)ans_size--;// 倒序打印得最后结果for (int i = ans_size;i >= 1;i--)cout << ans[i];return 0;
}

7. 冒泡排序

  • 时间复杂度:O( n 2 n^2 n2)
  • 空间复杂度:O( 1 1 1)
  • 稳定性:稳定

在这里插入图片描述
代码:

void bubbleSort(vector<int>& nums) {int n = nums.size();for (int i = 0; i < n-1; i++) {bool swapped = false;for (int j = 0; j < n-i-1; j++) {if (nums[j] > nums[j+1]) {swap(nums[j], nums[j+1]);swapped = true;}}// 如果一轮遍历没有发生交换,说明序列已经有序,提前结束排序if (!swapped) break;}}

例题:
在这里插入图片描述

#include <iostream>
#include <vector>
using namespace std;int BubbleSort(vector<int>& a,int n) {int swapped_num = 0;for (int i = 0;i < n - 1;i++) {// 判断是否提前结束bool swapped = false;for (int j = 0;j < n - 1 - i;j++) {if (a[j] > a[j + 1]) {swap(a[j], a[j + 1]);swapped_num++;swapped = true;}}// 如果内层循环没有再交换说明剩下的已经是有序的了,可提前结束if (swapped == false)break;}return swapped_num;
}int main()
{int n;int swapped_num;cin >> n;// 长度为变量,使用动态数组vector<int> a(n);for (int i = 0;i < n;i++)cin >> a[i];swapped_num = BubbleSort(a, n);cout << swapped_num;return 0;
}

8. 选择排序

在这里插入图片描述

  • 时间复杂度:O( n 2 n^2 n2)
  • 空间复杂度:O( 1 1 1)
  • 稳定性:不稳定(对于[20,20,5]这种情况,第一个20会和5交换,从而到第二个20的后面。改变了相等值的前后顺序,故不稳定)

代码:

void SelectSort(vector<int>& a) {int n = a.size();for (int i = 0;i < n;i++) {int minIndex = i;for (int j = i + 1;j < n;j++) {if (a[j] < a[minIndex])minIndex = j;}swap(a[i], a[minIndex]);}
}

9. 插入排序

在这里插入图片描述

  • 时间复杂度:O( n 2 n^2 n2)
  • 空间复杂度:O( 1 1 1)
  • 稳定性:稳定

代码:

void InsertSort(vector<int>& a) {for (int j = 1;j < a.size();j++) { //构造无序区for (int i = 0;i < j;i++) { //构造有序区if (a[j] < a[i]) {// 后移插入int tmp = a[j];for (int k = j - 1;k >= i;k--) {a[k + 1] = a[k];}a[i] = tmp;break; // 跳出有序区的循环}}}
}
  1. 希尔排序(减小增量排序)

在这里插入图片描述
在这里插入图片描述

  • 时间复杂度:最坏O( n 2 n^2 n2)、最好O( n n n)、平均O( n 1.5 n^{1.5} n1.5)
  • 空间复杂度:O( 1 1 1)
  • 稳定性:不稳定(例如:[20,20,10,30]排序后第一个20与10交换位置,故不稳定)

代码:

void ShellInsert(vector<int>& a, int start, int gap) {for (int j = start+gap;j < a.size();j+=gap) { //构造无序区for (int i = start;i < j;i+=gap) { //构造有序区if (a[j] < a[i]) {// 后移插入int tmp = a[j];for (int k = j - gap;k >= i;k-=gap) {a[k + gap] = a[k];}a[i] = tmp;break; // 跳出有序区的循环}}}
}void ShellSort(vector<int>& a) {for (int gap = a.size() / 2;gap >= 1;gap /= 2) {for (int i = 0;i < gap;i++) {ShellInsert(a, i, gap);}}
}
  1. 计数排序

计数排序(Counting Sort)算法。这是一种非基于比较的排序算法,特别适用于对整数进行排序,尤其是当输入数据范围不是很大时,其性能表现非常出色。(简化版的桶排序)

在这里插入图片描述

  • 时间复杂度:最坏O( n + k n+k n+k)(其中 n 是待排序数组的元素数量,k 是输入数据中最大元素的值)
  • 空间复杂度:O( k k k)
  • 稳定性:稳定
void CountSort(vector<int>& a) {// 1.找最大值int max = a[0];for (int i = 0;i < a.size();i++) {if (a[i] > max)max = a[i];}// 2.根据最大值开辟新数组vector<int> countArr(max + 1, 0);// 3.将原数据放入新数组中并计数for (int i = 0;i < a.size();i++) {countArr[a[i]]++;}// 4.按照下标依次取出计数数组中的下标a.clear();for (int i = 0;i < max + 1;i++) {while (countArr[i]) {a.push_back(i);countArr[i]--;}}
}
  1. 桶排序

桶排序 (Bucket sort)是计数排序的升级版

  • 设置一个定量的数组当作空桶;
  • 遍历输入数据,并且把数据一个一个放到对应的桶里去;
  • 对每个不是空的桶进行排序;
  • 从不是空的桶里把排好序的数据拼接起来。

在这里插入图片描述

  • 时间复杂度:O( n + k n+k n+k)
  • 空间复杂度:O( n + k n+k n+k)
  • 稳定性:取决于桶内的排序是否稳定
void BucketSort(vector<int>& a) {// max_element 返回的是迭代器,因此需要解引用才能得到实际值int max = *max_element(a.begin(), a.end());int min = *min_element(a.begin(), a.end());// 求需要桶的数量(默认a.size为桶的容量)int bucketNum = ((max - min + 1) / a.size())+1;vector<vector <int>> Bucket(bucketNum);// 把元素放入对应的桶里for (int i = 0;i < a.size();i++) {int index = (a[i] - min + 1) / a.size();Bucket[index].push_back(a[i]);}// 对桶内元素进行排序(任意排序都行)for (int i = 0;i < Bucket.size();i++) {sort(Bucket[i].begin(), Bucket[i].end());}// 将各桶中元素按顺序遍历取出a.clear();for (int i = 0;i < Bucket.size();i++) {for (int j = 0;j < Bucket[i].size();j++) {a.push_back(Bucket[i][j]);}}
}
http://www.lryc.cn/news/427703.html

相关文章:

  • 改善工作流
  • 迭代器失效
  • @RequestParam @RequestBody @PathVariable 这三个注解对应的前端使用vue的http请求时不同的调用方式
  • SQL - 索引
  • Oracle23ai新特性FOR LOOP循环控制结构增强
  • DHU OJ 二维数组
  • UDP/TCP --- Socket编程
  • 【C语言】最详细的单链表(两遍包会!)
  • QT:VS2019 CMake编译CEF
  • day31(8/19)——静态文件共享、playbook
  • 白骑士的C#教学实战项目篇 4.4 游戏开发
  • 在Vue工程中开发页面时,发现页面垂直方向出现两个滚动条的处理
  • 【C++初阶】:C++入门篇(一)
  • 【JAVA CORE_API】Day14 Collection、Iterator、增强for、泛型、List、Set
  • Go更换国内源配置环境变量
  • 澎湃认证显实力,浪潮信息存储兼容新篇章
  • Leetcode 3255. Find the Power of K-Size Subarrays II
  • Kotlin学习02-变量、常量、整数、浮点数、操作符、元组、包、导入
  • C++的模板简介
  • 树莓派5 笔记25:第一次启动与配置树莓派5_8G
  • Melittin 蜂毒肽;GIGAVLKVLT TGLPALISWI KRKRQQ
  • day32
  • 【clickhouse】 使用 SQLAlchemy 连接 ClickHouse 数据库的完整指南
  • 按键收集单击,双击和长按
  • 进程的异常终止
  • 并发编程 | Future是如何优化程序性能
  • Oracle笔记
  • LVS+Keepalived 双机热备
  • Web Image scr图片从后端API获取基本实现
  • 2024音频剪辑指南:探索四大高效工具!