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: 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大小的判别
#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. 高精度乘法
#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)
- 稳定性:稳定
代码:
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; // 跳出有序区的循环
}
}
}
}