作者前言
🎂 ✨✨✨✨✨✨🍧🍧🍧🍧🍧🍧🍧🎂
🎂 作者介绍: 🎂🎂
🎂 🎉🎉🎉🎉🎉🎉🎉 🎂
🎂作者id:老秦包你会, 🎂
简单介绍:🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂
喜欢学习C语言和python等编程语言,是一位爱分享的博主,有兴趣的小可爱可以来互讨 🎂🎂🎂🎂🎂🎂🎂🎂
🎂个人主页::小小页面🎂
🎂gitee页面:秦大大🎂
🎂🎂🎂🎂🎂🎂🎂🎂
🎂 一个爱分享的小博主 欢迎小可爱们前来借鉴🎂
习题
- **作者前言**
- 选择题
- 编程题
- offsetof宏
- 交换奇偶位
- 添加逗号
- 删除公共字符
选择题
解法:
编程题
题目:一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。
编写一个函数找出这两个只出现一次的数字。
例如:
有数组的元素是:1,2,3,4,5,1,2,3,4,6
只有5和6只出现1次,要找出5和6.
思路:
(1)暴力求解:遍历
(2):
我们可以拆成两个组,一个组存储有5 ,另一个组存储有6
首先我们可以先把整个数组进行异或操作
上图我们可以看到不同的位置上的异或操作的结果是1,那我们可以通过一个位置来区分,让二进制的该位置的数为1分成一组,不为1的分成另外一组,这样就可以分开
#include<stdio.h>
int main()
{
int arr[] = { 1,2,3,4,5,6,1,2,3,4 };
int i = 0;
int sum = 0;//全部异或的结果
for (i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
{
sum ^= arr[i];
}
int sum1 = sum;
int sum2 = sum;
int size = 0;
//统计出第几位为1
while (!(sum & 1))
{
sum = sum >> 1;
size++;
}
for (i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
{
if ((arr[i] >> size) & 1)
{
sum1 ^= arr[i];//计算出其中一个
}
}
printf("%d %d", sum1, sum1 ^ sum2);
return 0;
}
offsetof宏
写一个宏,计算结构体中某变量相对于首地址的偏移,并给出说明
考察:offsetof宏的实现
思路:我们可以把一个数转换成对应的结构体初始地址,然后返回对应成员的地址
#include<stdio.h>
#include<stddef.h>
#define MYOFFSEROF(type, mem) (size_t)(&(((type*)0)->mem)) //把0转变成这个结构体指针类型
struct S
{
int a;
char b;
};
int main()
{
printf("%d", offsetof(struct S, b));
printf("%zd", MYOFFSEROF(struct S, b));
return 0;
}
交换奇偶位
写一个宏,可以将一个整数的二进制位的奇数位和偶数位交换。
一个数之和=奇数位之和 + 偶数位之和
我们要获取一个数的奇数位 可以 与(&)上0x55555555 ,偶数位与(&)上0xaaaaaaaa
#include<stdio.h>
#define EXCHENG(a) (((a & 0x55555555)<<1) +((a & 0xaaaaaaaa)>>1))
int main()
{
int a = 10;
a = EXCHENG(a);
printf("%d", a);
return 0;
}
添加逗号
这道题的思路:
我们可以举例如 1,333,333 22,333,333 333,333,333 这三种情况,控制好间距就可以很好解决
#include <stdio.h>
#include<stdlib.h>
#include<string.h>
int main() {
long long num = 0;
scanf("%d", &num);
char *str = (char*)malloc(sizeof(char) * 14);
sprintf(str, "%d", num);
int size = strlen(str);
int sub = size % 3;
int i = 0;
//防止前面不满
if(sub)
{
for(;i < sub; i++)
{
printf("%c", str[i]);
}
if(sub != size)
printf(",");
}
int count = 0;
for(; i < size;i++)
{
if(count == 3)
{
printf(",");
count = 0;
}
count += printf("%c", str[i]);
}
free(str);
return 0;
}
删除公共字符
思路很简单就是在字符串里面找出相同的不打印,然后不同的打印出来
#include <stdio.h>
#include<stdlib.h>
#include <string.h>
int main()
{
char *str1 = (char*)malloc(sizeof(char)* 1000);
char *str2 = (char*)malloc(sizeof(char)* 1000);
gets(str1);
gets(str2);
int size = strlen(str1);
int i = 0;
int size1 = strlen(str2);
for (i = 0; i < size;i++)
{
int j = 0;
for (j = 0; j < size1; j++)
{
if(str1[i] == str2[j])
{
break;
}
}
if(j == size1)
printf("%c", str1[i]);
}
free(str1);
free(str2);
return 0;
}