
 
😶🌫️Take your time ! 😶🌫️
💥个人主页:🔥🔥🔥大魔王🔥🔥🔥
💥代码仓库:🔥🔥魔王修炼之路🔥🔥
💥所属专栏:🔥魔王的修炼之路–C语言🔥
如果你觉得这篇文章对你有帮助,请在文章结尾处留下你的点赞👍和关注💖,支持一下博主。同时记得收藏✨这篇文章,方便以后重新阅读。
文章目录
- 一、求最小公倍数
 - 二、句子逆序
 - 三、宏实现offsetof
 - 1、offsetof使用
 - 2、宏实现offsetof
 
- 四、写一个宏,交换一个数二进制的奇数位和偶数位
 - 五、给定一个正数sum,从n个有序元素的数组中寻找元素a,b,使得a+b的结果最接近sum,最快的复杂度为几?
 - 六、总结
 
一、求最小公倍数
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	int a = 0;
	scanf("%d", &a);
	printf("%d\n", a);
	return 0;
}
//求最大公约数
#include <stdio.h>
int max_common_divisor(int a, int b)
{
	//1.暴力穷举法:让较大数%较小数,如果余数为0,则小数为最大公约数。否则,小数减一,让原来的两个数同时对这个除数进行取余,当原来两个数都能整除时,则除数为最大公约数。
	int max = a;
	int min = b;
	if (max < min)
	{
		int temp = max;
		max = min;
		min = temp;
	}
	int q = min;
	while (1)
	{
		if (max % q == 0 && min % q == 0)
		{
			break;
		}
		else
			q--;
	}
	
	
	//2.辗转相除法:首先让大数除以小数,如果余数为0,则除数为最大公约数,否则让除数变为被除数,余数变为除数,重复,直到整除,此时的除数为最大公约数。
	int max = a;
	int min = b;
	if (max < min)
	{
		int temp = max;
		max = min;
		min = temp;
	}
	while (1)
	{
		int q = max % min;
		if (q == 0)
		{
			break;
		}
		else
		{
			max = min;
			min = q;
		}
	}
	return min;
}
int main()
{
	int a = 0;
	int b = 0;
	scanf("%d", &a);
	scanf("%d", &b);
	int max = max_common_divisor(a, b);
	//最小公倍数等于原来的两数相乘/最大公约数
	//也可以不求最大公约数,直接暴力求解:从较大数开始,除原数,如果不能整除,就++,然后继续,直到能够整除。
	//也可以让较小数从1开始乘,乘一次判断一次能不能整除大数。
	int min = a * b / max;
	printf("%d\n", min);
	return 0;
}
 
二、句子逆序
eg:I like you -> you like I
方法:整体逆序+单词逆序。
#include <stdio.h>
#include <string.h> 
void reverse(char* left, char* right)
{
	while (left < right)
	{
		char temp = *left;
		*left = *right;
		*right = temp;
		left++;
		right--;
	}
}
int main()
{
	char arr[100];
	gets(arr);
	//整体逆序
	char* left = arr;
	char* right =  arr + (strlen(arr)-1);
	reverse(left, right);
	//单词逆序
	left = arr;
	right = arr;
	while (1)
	{
		while (*right != ' ' && *right != '\0')
		{
			right++;
		}
		reverse(left, right - 1);
		if (*right == '\0')
		{
			break;
		}
		right++;
		left = right;
	}
	printf("%s", arr);
	return 0;
}
 
三、宏实现offsetof
offsetof:计算结构体成员的偏移量。
1、offsetof使用
#include <stdio.h>
#include <stddef.h>
struct test
{
	char b;
	int a;
	int c;
};
int main()
{
	printf("%d\n", offsetof(struct test, a));
	return 0;
}
 
2、宏实现offsetof
//宏实现offsetof
#include <stdio.h>
#include <stddef.h>
#define OFFSETOF(type,member) (size_t)(&(((type*)0)->member))
struct test
{
	char b;
	int a;
	int c;
};
int main()
{
	printf("%d\n", OFFSETOF(struct test, a));
	return 0;
}
 
四、写一个宏,交换一个数二进制的奇数位和偶数位
首先:交换一个数二进制的奇数位和偶数位需要分别摘出来它的二进制奇数位和偶数位,然后通过移位来使奇数位都移动到偶数位,偶数位都移动到奇数位,最后再合并。所以会用到01010101010101010101010101010101即0x55555555,10101010101010101010101010101010即0xAAAAAAAA,然后让奇数位左移一位,偶数位右移一位再按位或就行了。
宏实现:#define SWAP(x) (((x & 0xAAAAAAAA) >> 1) | ((x & 0x55555555) << 1))
五、给定一个正数sum,从n个有序元素的数组中寻找元素a,b,使得a+b的结果最接近sum,最快的复杂度为几?
采用双指针的方法,一个从最前面(left),一个从最后边(right),如果相加小于sum就left++,相加大于sum就right++,等left==rfght的时候退出循环。循环的时候记录每次最接近sum的数。
六、总结
- 博主长期更新,博主的目标是不断提升阅读体验和内容质量,如果你喜欢博主的文章,请点个赞或者关注博主支持一波,我会更加努力的为你呈现精彩的内容。
 
🌈专栏推荐
😈魔王的修炼之路–C语言
😈魔王的修炼之路–数据结构初阶
😈魔王的修炼之路–C++
😈魔王的修炼之路–Linux
更新不易,希望得到友友的三连支持一波。收藏这篇文章,意味着你将永久拥有它,无论何时何地,都可以立即找到重新阅读;关注博主,意味着无论何时何地,博主将永久和你一起学习进步,为你带来有价值的内容。




















