栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

求a和b中较大的数字. a,b置换.(数组中成对数字求单独的数字)c语言

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

求a和b中较大的数字. a,b置换.(数组中成对数字求单独的数字)c语言

目录

                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("%dn",sizeof(arr));//1
printf("%dn",sizeof(a);//2
printf("%dn",sizeof(aa);//3
printf("%dn",sizeof(aaa);//4
printf("%dn",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 

显然此处代码的作用是想把两个数字均输出出来,运行不出来是因为此处的brr是指针,长度位4字节,然而int类型的长度也是4字节,所以此处输出结果只能输出brr的一个元素。若想要全部输出需要在brr前加上*(解引用),然后×他的数组长度。

3)求下面代码的运行结果

int main(){
	int n = 10;
	printf("%dn", sizeof(n));//1
	printf("%dn", sizeof(n=6));//2
	printf("%dn", sizeof(n++));//3
	printf("%dn", n);//4
	printf("%dn",sizeof(n>6))//5
	printf("%dn",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);

}

此处没有进行函数封装,如需要函数封装请留言。

举一反三,若有三个不成对的数字呢:进行分组肯定先分成两组,然后在进行分组,利用递归的思想。此处因为常考,所以不做过多的讲解

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1030493.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号