C++练习备忘录

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

cpp 复制代码
#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. 设置输出宽度

cpp 复制代码
#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码转换

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

4. 高精度加法

cpp 复制代码
#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: 1234
	   s2: 567
	   序列号:01234
			a:  4321
			b:  765

	*/
	strtoint(s1, a);
	strtoint(s2, b);
	// 计算ans数组长度,按最长位+1
	int 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; // 留个位数
	}
	// 去除前导0
	while (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大小的判别

cpp 复制代码
#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();
	else
		return 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: 1234
	   s2: 567
	   序列号:01234
			a:  4321
			b:  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];
	}
	// 去除前导0
	while (ans[ans_size] == 0 && ans_size > 1)
		ans_size--;
	// 倒序打印得最后结果
	for (int i = ans_size;i >= 1;i--)
		cout << ans[i];
	return 0;
}

6. 高精度乘法

cpp 复制代码
#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	  1
				    a4b1 a3b1 a2b1  a1b1
			  a4b2	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;
		}
	}
	// 去除前导0
	while (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)
  • 稳定性:稳定

代码:

cpp 复制代码
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;
    }
  }

例题:

cpp 复制代码
#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的后面。改变了相等值的前后顺序,故不稳定)

代码:

cpp 复制代码
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)
  • 稳定性:稳定

代码:

cpp 复制代码
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; // 跳出有序区的循环
			}
		}
	}
}
相关推荐
坊钰19 分钟前
【Java 数据结构】移除链表元素
java·开发语言·数据结构·学习·链表
chenziang124 分钟前
leetcode hot100 LRU缓存
java·开发语言
时雨h39 分钟前
RuoYi-ue前端分离版部署流程
java·开发语言·前端
巫师不要去魔法部乱说1 小时前
PyCharm专项训练4 最小生成树算法
算法·pycharm
云计算DevOps-韩老师1 小时前
【网络云计算】2024第52周-每日【2024/12/25】小测-理论&实操-自己构造场景,写5个系统管理的脚本-解析
开发语言·网络·云计算·bash·perl
暮色尽染1 小时前
Python 正则表达式
开发语言·python
IT猿手1 小时前
最新高性能多目标优化算法:多目标麋鹿优化算法(MOEHO)求解GLSMOP1-GLSMOP9及工程应用---盘式制动器设计,提供完整MATLAB代码
开发语言·算法·机器学习·matlab·强化学习
小爬虫程序猿1 小时前
利用Java爬虫获取速卖通(AliExpress)商品详情的详细指南
java·开发语言·爬虫
阿七想学习1 小时前
数据结构《排序》
java·数据结构·学习·算法·排序算法
xlsw_1 小时前
java全栈day21--Web后端实战之利用Mybaits查询数据
java·开发语言