创作不易,切勿白嫖,多多点赞支持!,如有疑问欢迎评论区讨论
一、冒泡排序
1. 从当前元素起,向后依次比较每一对相邻元素,若逆序则交换
2. 对所有元素均重复以上步骤,直至最后一个元素
void arr1(int arr[], int sz)
{
int teep = 0;
int i, j;//i为循环趟数,j为内部循环次数
for (i = 0; i < sz-1; i++)
{
for (j = 0; j < sz-1-i; j++)
{
if (arr[j] < arr[j + 1])
{
teep = arr[j + 1];
arr[j + 1] = arr[j];
arr[j] = teep;
}
}
}
}
int main()
{
int arr[10] = { -1,2,0,-3,5,9,6,8,-4,10 };
int i;
int sz = sizeof(arr) / sizeof(arr[0]);//元素个数
arr1(arr, sz);//冒泡排序法函数
for (i = 0; i < sz; i++)
printf("%d\t", arr[i]);
return 0;
}
样题输出:10 9 8 6 5 2 0 -1 -3 -4
二 、创建一个整形数组,完成对数组的操作
1、实现函数Iint(),初始化数组全部为0
2、实现Print(),模拟打印数组中的元素
3、实现reverse()函数,完成数组元素的逆置(数组中的内容倒过来)
void Iint(int arr[], int sz)
{
int i;
for (i = 0; i < sz; i++)
{
arr[i] = 0;
}
}
void Print(int arr[], int sz)
{
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
}
void Reverse(int arr[], int sz)//逆序函数
{
int i;
int temp = 0;
for (i = 0; i < sz; i++)
{
temp = arr[sz - 1];
arr[sz - 1] = arr[i];
arr[i] = temp;
sz--;
}
}
int main()
{
int arr[10] = { 1,2,3,4,5,6,8,9,7,10 };
int sz = sizeof(arr) / sizeof(arr[0]);
//模拟打印函数
//初始化前
Print(arr, sz);
//Iint(arr,sz);//对数组初始化全零
//初始化后
//Print(arr, sz);
Reverse(arr, sz);
Print(arr, sz);
return 0;
}
样题输出:
未逆序前:1 2 3 4 5 6 8 9 7 10
逆序之后:10 7 9 8 6 5 4 3 2 1
注:Iint函数已经注释 (想操作,去掉注释即可)
三、将数组a中的内容和数组b中的内容交换
1、数组一样大
int main()
{
int arr1[5] = { 1,2,3,4,5 };
int arr2[5] = { 5,4,3,2,1 };
int arr3 = 0;
int sz = sizeof(arr1) / sizeof(arr1[0]);
int i,j;
for (i = 0; i < sz; i++)
{
arr3 = arr1[i];
arr1[i] = arr2[i];
arr2[i] = arr3;
}
return 0;
}
四、统计二进制中1的个数
此题列举了多种解法!
解法一:
int Sum(unsigned int a)//传过来的数改为无符号数,符号位无效
{
int count = 0;
while (a)
{
if (a % 2 == 1)
{
count++;
}
a = a / 2;
}
return count;
}
int main()
{
int a = 0;
scanf("%d", &a);
//写一个函数,求a的二进制(补码)表示中1的个数
int count=Sum(a);
printf("%d\n", count);
system("pause");//system库函数—执行系统命令pause(暂停)
return 0;
}
解法二:
int Sum(int a)
{
int count = 0;
int i;
for (i = 0; i<32; i++)
{
if (((a >> i) & 1) == 1)
{
count++;
}
}
return count;
}
int main()
{
int a = 0;
scanf("%d", &a);
//写一个函数,求a的二进制(补码)表示中1的个数
int count=Sum(a);
printf("%d\n", count);
system("pause");//system库函数—执行系统命令pause(暂停)
return 0;
}
解法三:
int Sum(int a)
{
int count = 0;
//13 1101 a
//12 1100 a-1
//1100 a
//1011 a-1
//1000 a
//0111 a-1
//0000
while (a)
{
a = a & (a - 1);
count++;
}
return count;
}
int main()
{
int a = 0;
scanf("%d", &a);
//写一个函数,求a的二进制(补码)表示中1的个数
int count=Sum(a);
printf("%d\n", count);
system("pause");//system库函数—执行系统命令pause(暂停)
return 0;
}
五、求两个二进制中不同位的个数
解法一:
int main()
{
int count = 0;
int a = 5;
int b = 9;
int i;
for (i = 0; i < 32; i++)
{
a = a >> i;
b = b >> i;
if (a!=b)
{
count++;
}
}
printf("%d\n", count);
return 0;
}
解法二:
int Sum(int a)
{
int count = 0;
while (a)
{
a = a & (a - 1);
count++;
}
return count;
}
int Get_diff_bit(int m, int n)
{
int tmp = m ^ n;//按位异或相同为0,相异为1
return Sum(tmp);
}
int main()
{
int count = 0;
int m = 0;
int n = 0;
scanf("%d%d", &m, &n);
count=Get_diff_bit(m, n);//创建一个函数实现计算两个二进制中有多少个不同的个数
printf("%d\n", count);
return 0;
}
以上代码均在vs2022环境下编译