C语言初阶练习4.0

简介: 目录1. 冒泡排序2. 创建一个整形数组,完成对数组的操作3. 将数组A中的内容和数组B中的内容进行交换。(数组一样大)4. 求两个数二进制中不同位的个数5. 打印整数二进制的奇数位和偶数位6. 统计二进制1的个数7. 交换两个变量(不创建临时变量)

1. 冒泡排序

冒泡排序的思想:

两两相邻的元素进行比较,如果有可能的话需要交换。一趟冒泡排序能搞定一个数字,让当前待排序的数组中一个元素来到最终应该出现的位置上

目的:

将一系列数字按照一定规律排序,如从小到大排列:

#include<stdio.h>
void bubble_sort(int arr[],int sz)
{
  int i = 0;
  for (i = 0; i < sz - 1; i++)   //确定趟数
  {
    int j = 0;
    for (j = 0; j < sz - 1 - i; j++)   //一趟冒泡排序的过程
    {
      int tmp = 0;
      if (arr[j] > arr[j + 1])
      {
        //交换
        tmp = arr[j];
        arr[j] = arr[j + 1];
        arr[j + 1] = tmp;
      }
    }
  }
}
int main()
{
  int arr[] = { 3,1,5,2,4,9,0,7,6,8 };
  //设计一个函数对arr数组进行冒泡排序--冒泡排序的算法
  int sz = sizeof(arr) / sizeof(arr[0]);
  //数组传参
  bubble_sort(arr,sz);
  int i = 0;
  for (i = 0; i < 10; i++)
  {
    printf("%d ", arr[i]);
  }
  return 0;
}

将乱序数字3,1,5,2,4,9,0,7,6,8重新按照从小到大排列效果如下:

image.png

2. 创建一个整形数组,完成对数组的操作

目的:

  1. 实现函数init() 初始化数组为全0
  2. 实现print()  打印数组的每个元素
  3. 实现reverse()  函数完成数组元素的逆置。

要求:自己设计以上函数的参数,返回值。

#include<stdio.h>
void init(int arr[],int sz)
{
  int i = 0;
  for (i = 0; i < 10; i++)
  {
    arr[i] = 0;
  }
}
void print(int arr[], int sz)
{
  int i = 0;
  for (i = 0; i < 10; i++)
  {
    printf("%d ", arr[i]);
  }
}
void reverse(int arr[], int sz)
{
  int left = 0;
  int right = sz - 1;
  while (left < right)
  {
    int tmp = arr[left];
    arr[left] = arr[right];
    arr[right] = tmp;
    left++;
    right--;
  }
}
int main()
{
  int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
  int sz = sizeof(arr) / sizeof(arr[0]);
  print(arr, sz);
  printf("\n");
  //init(arr, sz);
  //print(arr, sz);
  reverse(arr, sz);
  print(arr, sz);
  return 0;
}

image.png

3. 将数组A中的内容和数组B中的内容进行交换。(数组一样大)

#include<stdio.h>
#include<string.h>
void print(int arr1[],int sz)
{
  int m = 0;
  for (m = 0; m < sz; m++)
  {
    printf("%d ", arr1[m]);
  }
}
int main()
{
  int arr1[5] = { 1,3,5,7,9 };
  int arr2[5] = { 2,4,6,8,10 };
  int i = 0;
  int sz = sizeof(arr1) / sizeof(arr1[0]);
  for (i = 0; i < 5; i++)
  {
    int tmp = arr1[i];
    arr1[i] = arr2[i];
    arr2[i] = tmp;
  }
  print(arr1, sz);
  return 0;
}

image.png

4. 求两个数二进制中不同位的个数

编程实现:两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同?

输入例子:1999 2299

输出例子:7

代码如下:

#include<stdio.h>
int main()
{
  int m = 0;
  int n = 0;
  int tmp = 0;
  int count = 0;
  scanf("%d %d", &m, &n);
  tmp = m ^ n;
  while (tmp != 0)
  {
    count++;
    tmp = tmp & (tmp - 1);
  }
  printf("%d\n", count);
  return 0;
}

image.png

5.  打印整数二进制的奇数位和偶数位

#include<stdio.h>
void Printbit(int num)
{
  for (int i = 31; i >= 1; i -= 2)
  {
    printf("%d ", (num >> i) & 1);
  }
  printf("\n");
  for (int i = 30; i >= 0; i -= 2)
  {
    printf("%d ", (num >> i) & 1);
  }
  printf("\n");
}
int main()
{
  int num = 0;
  scanf("%d", &num);
  Printbit(num);
  return 0;
}

image.png

6. 统计二进制1的个数

比如: 15    0000 1111    4 个 1

1.
#include<stdio.h>
int count_one_bit(int n)
{
  int count = 0;
  while (n)
  {
    if (n % 2 == 1)
      count++;
    n = n / 2;
  }
  printf("%d\n", count);
  return count;
}
int main()
{
  int count = 0;
  int n = 0;
  scanf("%d", &n);
  count_one_bit(n);
  return 0;
}

image.png

7. 交换两个变量(不创建临时变量)

此题在之前的博客中有讲到,当时讲了4种方法,这是其中一种。

#include<stdio.h>
int main()
{
  int a = 3;
  int b = 5;
  a = a ^ b;
  b = a ^ b;  //即为  a ^ b ^ b = a ^ 0 = a
  a = a ^ b; //即为  a ^ a ^ b = 0 ^ b = b
  printf("a=%d b=%d", a, b);   // a=5 b=3
}
相关文章
|
3月前
|
C语言
C语言初阶:如何判断是否为素数并且输出
C语言初阶:如何判断是否为素数并且输出
20 0
|
4月前
|
算法 C语言 容器
从C语言到C++_18(stack和queue的常用函数+相关练习)力扣(上)
从C语言到C++_18(stack和queue的常用函数+相关练习)力扣
38 0
|
2月前
|
编译器 C语言
【C语言初阶】指针篇—下
【C语言初阶】指针篇—下
|
2月前
|
存储 C语言
【C语言初阶】指针篇—上
【C语言初阶】指针篇—上
|
3月前
|
C语言
C语言练习代码第一篇
C语言练习代码第一篇
|
3月前
|
C语言
【初始C语言8】详细讲解初阶结构体的知识
【初始C语言8】详细讲解初阶结构体的知识
|
3月前
|
C语言
|
3月前
|
编译器 C语言
|
3月前
|
C语言
|
4月前
|
存储 前端开发 算法
从C语言到C++_18(stack和queue的常用函数+相关练习)力扣(下)
从C语言到C++_18(stack和queue的常用函数+相关练习)力扣
15 0