目录
a b中较大的数字
a b交换
通过做题复习知识点(数组中成对数字求单独的数字)
求a和b中较大的数字并返回
1)简单的if else判断语句
const double d1;
2)三位运算符 ? :
int max(int a,int b){
int c=a>b?a:b;
return c;
}
3)switch语句
int max(int a,int b){
switch(a>b){
case 1:return a;
case 0:return b;
default:break;}
}
4)循环
int max(int a,int b){
while(a>b){
return a;
}
return b;
}
5)仍是判断的方法
int max(int a,int b){
return (a>b)*a+(b>a)*b ;
}
6)利用公式
int max(int a,int b){
int c=((a + b) + abs(a - b)) / 2 ;
return c;
}
交换a b 变量的值
1)利用中间变量
int swap(int *a,int *b){
int tmp=*a;
*a=*b;
*b=temp;
}
2)用加减法
int swap(int* a,int* b){
*a=*a+*b;
*b=*a-*b;
*a=*a-*b;
printf("%3d%3d",a,b);
}
3)用^异或运算符
int swap(int *a,int *b){
*a=*a^*b;
*b=*a^*b;
*a=*a^*b;
}
4)用乘除运算
int swap(int *a,int *b){
*a=*a**b;
*b=*a/*b;
*a=*a/*b;
}
知识点复习
1)求下面代码的运行结果
int main(){
int arr[3];
int *a[3];
int **a[3][4];
int ***a[3][4][5];
int (*brr)[3];
printf("%d\n",sizeof(arr));//1
printf("%d\n",sizeof(a);//2
printf("%d\n",sizeof(aa);//3
printf("%d\n",sizeof(aaa);//4
printf("%d\n",sizeof(brr);//5
}
结果如下
1)此处的arr为数组长度 3*4=12
2)此处因为与运算符优先级的缘故,落脚点为数组,指针数组,前面是int 类型的指针,所以长度为4,字节,因为落脚点是数组,所以结果为3*4=12
3)同上,落脚点为数组,结果为3*4*4=48
4)同上,落脚地点是数组,结果位3*4*5*4=240
5)此处落脚地点位指针,指向数组的指针,所以i结果位4,
2)找出下列代码的问题
int main(){
int arr[3]={1,2,3};
int *brr=(int*arr)malloc(2*sizeof(int));
if(brr==NULL){
return 0;}
brr[0]=23;
brr[1]=33;
for(int i=0;i<sizeof(arr)/sizeof(arr[int]);i++)
printf("%3d",arr[i]);
for(int j=0;j<sizeof(brr)/sizeof(int);j++)
printf("%4d",brr[j]);
}
显然此处代码的作用是想把两个数字均输出出来,运行不出来是因为此处的brr是指针,长度位4字节,然而int类型的长度也是4字节,所以此处输出结果只能输出brr的一个元素。若想要全部输出需要在brr前加上*(解引用),然后×他的数组长度。
3)求下面代码的运行结果
int main(){
int n = 10;
printf("%d\n", sizeof(n));//1
printf("%d\n", sizeof(n=6));//2
printf("%d\n", sizeof(n++));//3
printf("%d\n", n);//4
printf("%d\n",sizeof(n>6))//5
printf("%d\n",sizeof(n=n>6))//6
}
运行结果如下:
1)int 类型的字节长度 4
2)sizeof(int)=4 sizeof()阶段不会运行,只会用数据类型替换
3)sizeof(int)=4
4)此时是10,
5)bool类型,长度为1
6)int类型 为4
总结:sizeof不是一个函数,也不是一元运算符,是一个类似于宏替换的特殊关键字 括号内的内容编译器也不会进行编译,会直接获取数据类型,
4)找出代码的错误
int main(){
int i;//1
int i2=999;//2
int i3=1024;//3
int *p;//4
*p=5;//5
p=&i3;//6
const double d1;//7
const double d2=10.0;//8
const double d3=0.5;//9
const double *pd=&d2;//10
}
1)此处仅仅会报警,没有赋初始值;
2)3)均正确
4)5)此处定义指针没有指向内容,为野指针,野指针进行赋值会直接崩掉,
7)此处将d1定义为常变量,所以此处必须进行赋初始值;
5)一个数组中的数字都是成对存在的,只有一个数字是单独存在的,求出该数字
此处的方法便是利用异或(^)运算,思路如下:因为异或是相同异或为0,不同异或为1,0和任何数异或均为那个数字,然而在这组数字中,只有一个数字是单独存在的,因此将该数组中所有的数据进行异或得到的结果便是那个单独的数字。 (此处异或是化为二进制进行异或)代码如下:
int main(){
int arr[] = { 2, 4, 3, 2, 7, 5, 7, 5, 4, 3, 6, 1, 1 };
int len = sizeof(arr) / sizeof(arr[0]);
int n = 0;
for (int i = 0; i < len; i++){
n = n^arr[i];
}
printf("%d", n);
}
例题变形:条件同上,有两个单独的数据找出来
思路如下:我们需要找出这两个单独的数之间的差异,然后根据这个不同点进行分成两组,然后进行两组数据相异或,得到的两个值便是我们要的数字。如何找找到两个数之间的不同之处呢,首先要找到两个数字之间的关系:首先将这一整组数据进行异或运算,最后得到的结果便是两个单独数字向异或的结果,得到结果哪一权值为1则说明这两组数据的该权值不一样。利用该思虑可分成两组 进行异或运算得到连个数字。代码如下:
int main(){
int arr[] = { 2, 4, 3, 2, 7, 5, 7, 5, 4, 3, 6, 1, 1,9 };
int len = sizeof(arr) / sizeof(arr[0]);
int n = 0;
for (int i = 0; i < len; i++){
n = n^arr[i];
}
int m = 1;
int num1 = 0;
int num2 = 0;
while ((n&m) ==0){
m = m << 2;
}
for (int j = 0; j < len; j++){
if ((arr[j] & m) == 0){
num1 = num1^arr[j];
}
if ((arr[j] & m) !=0 ){
num2 = num2^arr[j];
}
}
printf("%4d%4d", num1, num2);
}
此处没有进行函数封装,如需要函数封装请留言。
举一反三,若有三个不成对的数字呢:进行分组肯定先分成两组,然后在进行分组,利用递归的思想。此处因为常考,所以不做过多的讲解