百算前言
由于是刷题博文不会写的比知识博文细致的,简单的题我可能只会贴代码,但是一般以我的性格简单的我也会标一标,所以我不会裸代码上去,百算暂时先用左神新手课来入局,后面就是神之战,百家百算。因为百算成机这个栏目是大厂敲门砖那个栏目的高度实现。
不会很细致的标明,因为我想刷多点题
第一算
1.打印一个数的32位格式
#define _CRT_SECURE_NO_WARNINGS 1 #include <iostream> using namespace std; void Print32(int num) { int i = 0; for (i = 31; i >= 0; i--) { printf((num & (1 << i)) == 0 ? "0" : "1"); } cout << endl; } int main() { //看一下整形最大值 int test = INT_MAX; //整形最小 int test2 = INT_MIN; Print32(test); Print32(test2); return 0; }
2.给定一个参数N 返回1!+2!+…+N!
long FactSum(int num) { int i = 0; long sum = 0; long cur = 1; for (i = 1; i <= num; i++) { cur *= i; sum += cur; } return sum; } int main() { cout << FactSum(10) << endl; return 0; }
3.选择排序
升级的选择排序
//数组打印 void PrintArray(int* array,int n) { int i = 0; for (i = 0; i < n; i++) { cout << array[i] << " "; } cout << endl; } //元素交换 void Swap(int* px, int* py) { int tmp = *px; *px = *py; *py = tmp; } //选择排序 //为了提高量的效率 我们一趟就把范围内最大最小 //都取出来放到正确的位置上 void SelectSort(int* array, int n) { //首先考虑边界 空数组或单元素数组就直接返回 if (!n || n == 1) return; //不空就继续 //头标 int begin = 0; //尾标 int end = n - 1; while (begin < end) { //最小元素位置 int MinIndex = begin; //最大元素位置 int MaxIndex = end; int i = 0; for (i = begin; i <= end; i++) { //找最小 if (array[i] < array[MinIndex]) MinIndex = i; //找最大 if (array[i] > array[MaxIndex]) MaxIndex = i; } //找完再交换 Swap(&array[begin], &array[MinIndex]); if (begin == MaxIndex) //如果最大数就是begin位置的,那么交换的时候最大数连带着下标一起动 MaxIndex = MinIndex; Swap(&array[end], &array[MaxIndex]); begin++; end--; } } int main() { //随便创建一个数组 int a[] = { 5,8,54,6,5,0,4,55,8,84,4,1 }; //打印交换前的 PrintArray(a, sizeof(a) / sizeof(a[0])); //交换一下 SelectSort(a, sizeof(a) / sizeof(a[0])); //打印交换后的 PrintArray(a, sizeof(a) / sizeof(a[0])); return 0; }
3.冒泡排序
//数组打印 void PrintArray(int* array, int n) { int i = 0; for (i = 0; i < n; i++) { cout << array[i] << " "; } cout << endl; } //元素交换 void Swap(int* px, int* py) { int tmp = *px; *px = *py; *py = tmp; } void BubbleSort(int* array, int n) { if (!array || n<2) return; int i = 0; for (i = 0; i < n - 1; i++) { //交换标记 int flag = 0; int j = 0; for (j = 0; j < n - 1 - i;j++) { if (array[j] > array[j + 1]) { //交换标记置1 flag = 1; Swap(&array[j],&array[j+1]); } } if (!flag) break; } } int main() { //随便创建一个数组 int a[] = { 5,8,54,6,5,0,4,55,8,84,4,1 }; //打印交换前的 PrintArray(a, sizeof(a) / sizeof(a[0])); //交换一下 BubbleSort(a, sizeof(a) / sizeof(a[0])); //打印交换后的 PrintArray(a, sizeof(a) / sizeof(a[0])); return 0; }
4.插入排序
//数组打印 void PrintArray(int* array, int n) { int i = 0; for (i = 0; i < n; i++) { cout << array[i] << " "; } cout << endl; } //元素交换 void Swap(int* px, int* py) { int tmp = *px; *px = *py; *py = tmp; } //插入排序 void InsertSort(int* array, int n) { if (!array || n < 2) return; //0-0 一个元素是好的 //0-1 //0-2 //0-n 这些范围变,变的就是end int end = 1; for (end = 1; end < n; end++) { //新来的数在end这个位置上面 int cur = end; //向前跑 while (cur - 1 >= 0 && array[cur - 1] > array[cur]) { //交换 Swap(&array[cur - 1], &array[cur]); //向前移 cur--; } } } int main() { //随便创建一个数组 int a[] = { 5,8,54,6,5,0,4,55,8,84,4,1 }; //打印交换前的 PrintArray(a, sizeof(a) / sizeof(a[0])); //交换一下 InsertSort(a, sizeof(a) / sizeof(a[0])); //打印交换后的 PrintArray(a, sizeof(a) / sizeof(a[0])); return 0; }