今日份的小练习

交换两个数及不创建临时变量交换两个数 

(1)一般两个数的交换

#include<stdio.h>
int main()
{
	int a = 10;
	int b = 20;
	int c;
	c = a;
	a = b;
	b = c;
	printf("%d\n", a);
	printf("%d\n", b);
	return 0;
}

 

(2)不创建临时变量交换两个数 

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
	int a=1, b=0;
	a = a^b;
	b = a^b;
	a = a^b;
	printf("%d %d\n", a, b);
	return 0;
}

其中的  ^ 符号表示按位异或(相同为0,不同为1),相关的还有按位与(都为1才为1),按位或|(有一个1则结果为1)。

值得注意的是,虽然这种不创建临时变量的方法显得高大上,但是一般程序都用第一种方法,毕竟程序要给人看的,最好甚至能让不懂c的人看懂。

 求两个数的最大公约数

数学思想就是,两个数都能同时除尽的最大的那个数,这两个数中若较大数可以被较小数除尽,则较小数为他们的最大公约数。

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main(){
	int k, m, n, a, b;
	printf("输入两个数");
	scanf("%d%d", &m, &n);
	if (m > n){
        a = n;
    }
	else{
    a = m;
    }
	for (k = 1; k <= a; k++){
		if (m%k == 0 && n%k == 0){
			b = k;
		}
	}printf("%d", b);
	return 0;
}

再来个装逼的,百度一下求两个数的最大公约数的方法——辗转相除法,把他写成代码如下:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	int a, b;

	scanf("%d%d", &a, &b);
	int c;

	while (c = a % b)
	{
		a = b;
		b = c;
	}

	printf("%d", b);
	return 0;
}

那如何跳出循环呢?  其实他自己可以跳出循环,因为在c语言中,0为假,非0为真,所以只要当while()中的值为0,则自动跳出。在这没有按辗转相除法的定义比较出两个数的大小是因为不需要,就算是小数除以大数,其余数也是那个大数,也就是多除一步的事。那最不济的情况就是两个数互质,那就是用循环到某一次的数除以 1,其余数依然为0,也可以跳出循环。

求十个数中最大的数 

思想就是创建一个变量并赋值,然后用这个变量与那十个数依次比较,将较大值放入这个变量中,最后输出即可。

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main(){
	int arr[10] = {0,3,2,4,1,9,5,6,7,8,};
	int max = 0;
	int i = 0;
	for (i = 0; i < 10; i++){
		if (max < arr[i]){
			max = arr[i];
		}
	}
	printf("%d\n", max);
	return 0;
}

来个小升级:找出最大值和次大值。

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	int a[9] = { 0x80000000, 7, -5, 5, 56, -1, 0, 6, 3 };
	int max = a[0];
	int sec = 0x80000000;
	for (int i = 0; i < 9; i++){
		if (max < a[i]){    //表示max与a中元素比较,当max小于a【i】时,此时a【i】为最大值,而max为次大值
			sec = max;
			max = a[i];
		}
		else if(sec<a[i+1]){//表示此数组中的第一个元素已经是该数组最大值,则其值不变,只需找出该数组中从第二个元素到最后一个中的最大值,即找出了所有元素中的次大值
			sec = a[i+1];
		}
	}
	printf("%d\n", max);
	printf("%d\n", sec);
	return 0;
}

但是这种将max初始化为数组第一个元素会有弊端,当需要将这个数组的最大值,次大值,次次大值等都要打印出来时,则每个嵌套的else if 中的a【i】需要依次+1,+2,+3等 ,十分不方便,显得复杂,此时应该将max初始化为有符号的最小值,即0x80000000。代码如下:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	int arr[10] = { 9, 8, 7, 0, -1, 4, 2, -3, 3, 1 };
	int max = 0x80000000;
	int sec = 0x80000000;
	int i;

	for (i = 0; i < 10; i++)
	{
		if (max < arr[i])
		{
			sec = max;
			max = arr[i];
		}
		else if (sec < arr[i])
		{
			sec = arr[i];
		}
	}
	printf("%d\n", max);
	printf("%d\n", sec);
	return 0;
}

此时,若需要输出最大值,次大值或次次大值等,只需嵌套即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值