整数,打印32位状态,注意左移右移的使用。没有带符号左移,左移只有不带符号的,右移带符号不代符号都有。
左移就是右侧拿0来补,左移以为,等同于num*2的值。
//左神打印数字32位(0-31)
void print32(int num)
{
for (int i = 31; i >= 0; i--)
{
cout << ((num&(1 << i)) == 0 ? "0" : "1" );
}
};
取反加1相当于负
int d = 2121321;
int e = -d;
int f = (~d + 1);
print32(e);
print32(f);
打印的结果是一样的
c++中最大数INT32_MAX;最小数INT32_MIN;
同时,c++不能像java一样,用>>>表示带符号右移。
给定一个数N,求1!+2!+3!+ …+(N-1)!+N!的值
两种代码对比,明显看出,利用之前结论的时间复杂度要好很多。
long factorial(int n);
long f1(int n)
{
long ans = 0;
for (int i = 1; i <= n; i++)
{
ans += factorial(i);
}
return ans;
}
long factorial(int n)
{
long ans = 1;
for (int i = 1; i <= n; i++)
{
ans *= i;
}
return ans;
}
long f2(int n)
{
long ans = 0;
long cur = 1;
for (int i = 1; i <= n; i++)
{
cur = cur * i;
ans += cur;
}
return ans;
}
int main()
{
int n = 10;
long a=f1(10);
long b=f2(10);
cout << a << endl;
cout << b << endl;
}
每遍历一趟,都通过比较遍历出最小的,放到最左侧,经过n趟后,数列变得有序。
void swap(int a[], int i, int j)
{
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
void selectSort(int a[], int len)
{
int minindex;
for (int i = 0; i < len - 1; i++)
{
minindex = i;
for (int j = i + 1; j < len; j++)
{
minindex = (a[minindex] > a[j]) ? j : minindex;
}
swap(a,minindex,i);
}
}
void print(int a[], int n)
{
for (int j = 0; j < n; j++)
{
cout << a[j] << " ";
}
cout << endl;
};
int main()
{
int a[10] = { 8,1,3,2,4,121,13,4242,34321,21312 };
cout << "初始序列:";
print(a, 10);
selectSort(a, 10);
cout << "排序结果:";
print(a, 10);
system("pause");
return 0;
}
选择排序是经典排序,理解后直接背过即可,一定要理解!!!
思想:从最左边的数据开始,以此往右比较,两两比较中,最小的那个往上“冒”,称为冒泡排序,每趟排序都会确定当前无序序列中最右边的位置,即最大的位置。
void swap(int a[], int i, int j)
{
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
void bubbleSort(int a[], int n)
{
if (n < 2 || a == nullptr)
{
return;
}
for (int i = n - 1; i >= 0; i--)
{
for (int j = 0; j < i; j++)
{
if (a[j] > a[j + 1])
{
swap(a, j, j + 1);
}
}
}
return;
}
void print(int a[], int n)
{
for (int i = 0; i < n; i++)
{
cout << a[i] << " ";
}
cout << endl;
}
int main()
{
int a[10] = { 123123,321312,1,2,4,3,5,8,8656,545 };
cout << "初始序列:";
print(a, 10);
cout << "选择排序后:";
bubbleSort(a, 10);
print(a, 10);
system("pause");
return 0;
}
像扑克牌一样,无序序列中的最左的元素直接插入到有序序列的该插入的位置。称为插入排序。过程有点类似于冒泡排序,需要两两之间做比较。
大体都是一样的,但是冒泡排序是相邻(j和j+1)之间交换,而插入排序是跳跃着(i和j)之间进行交换。
#include
using namespace std;
void swap(int a[], int i, int j)
{
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
void insertSort(int a[], int n)
{
if (a == nullptr || n < 2)
{
return;
}
for (int i = 0; i <= n - 1; i++)
{
for (int j = 0; j < i; j++)
{
if (a[j] > a[i])
{
swap(a, i, j);
}
}
}
return;
}
void print(int a[], int n)
{
for (int i = 0; i < n; i++)
{
cout << a[i] << " ";
}
cout << endl;
}
int main()
{
int a[10] = { 123123,321312,1,2,4,3,5,8,8656,545 };
cout << "初始序列:";
print(a, 10);
cout << "选择排序后:";
insertSort(a, 10);
print(a, 10);
system("pause");
return 0;
}
与对数器有关的,下次在补充