C语言学习记录——이십일 零碎知识

目录

统计二进制中1的个数

求二进制中不同位的个数

输出二进制的奇数位和偶数位

使用指针打印数组内容

乘法口诀表

字符串逆序

一个数的每位之和(递归实现)

递归实现n的k次方


统计二进制中1的个数

#include <stdio.h>
#include <stdlib.h>

int count_bit_one(unsigned int n)
{
    int count = 0;
    while (n)
    {
        if (n % 2 == 1)
            count++;
        n = n / 2;
    }
    return count;
}

int main()
{
    int a = 0; scanf("%d", &a);
    int count = count_bit_one(a);
    printf("count = %d\n", count);
    system("pause");
    return 0;
}

或者不限定为无符号数

int count_bit_one(int n)
{
    int count = 0;
    int i = 0;
    for (i = 0; i < 32; i++)
    {
        if (((n >> i) & 1) == 1)
            count++;
    }
    return count;
}

但是两种算法都不太好。

int count_bit_one(int n)
{
    int count = 0;
    while (n)
    {
        n = n & (n - 1);
        count++;
    }
    return count;
}

n & (n - 1)假如n为13,13的二进制数为1101

1101 n

1100 n-1

1100 n新

1011 n-1

1000 n新新 

011 n - 1

0000 n新新新

每按位与一次,就会去掉最右面的1。

与之前的方法不同,无论怎样都要循环32遍,而这个方法有多少个1循环多少遍。

system("pause")的意思是暂停正在执行的程序,等待用户按下任意键后继续执行。

求二进制中不同位的个数

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

输出二进制的奇数位和偶数位

 获取一个整数二进制序列中所有的偶数位和奇数位,分别打印出二进制序列

void Print(int m)
{
    int i = 0;
    printf("奇数位: \n");
    for (i = 30; i >= 0; i -= 2)
    {
        printf("%d ", (m >> i) & 1);
    }
    printf("\n");
    printf("偶数位: \n");
    for (i = 31; i >= 1; i -= 2)
    {
        printf("%d ", (m >> i) & 1);
    }
    printf("\n");
}

int main()
{
    int m = 0;
    scanf("%d", &m);
    Print(m);
    return 0;
}

使用指针打印数组内容

void Print(int* p, int sz)
{
    int i = 0;
    for (i = 0; i < sz; i++)
    {
        printf("%d ", *(p + i));
    }
}

int main()
{
    int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    int sz = sizeof(arr) / sizeof(arr[0]);
    Print(arr, sz);
    return 0;
}

递归存在限制条件,每次递归被调用后越来越接近这个限制条件,满足限制条件后,递归停止。递归层次太深会出现栈溢出现象。

乘法口诀表

实现一个函数,打印乘法口诀表,行数和列数自己指定,如:输入9,输出9*9口诀表,输入12,输出12*12口诀表

void print_table(int n)
{
    int i = 0;
    for (i = 1; i <= n; i++)
    {
        int j = 0;
        for (j = 1; j <= i; j++)
        {
            printf("%d * %d = %-4d", i, j, i * j);
        }
        printf("\n");
    }
}

int main()
{
    int n = 0;
    scanf("%d", &n);
    print_table(n);
    return 0;
}

字符串逆序

编写一个函数reverse_string(char * string)

实现:将参数字符串中的字符反向排列

要求:不能使用c函数库中的字符串操作函数

#include <string.h>

int my_strlen(char* str)
{
    int count = 0;
    while (*str != '\0')
    {
        count++;
        str++;
    }
    return count;
}

void reverse_string(char arr[])
{
    int left = 0;
    int right = my_strlen(arr) - 1;
    while (left < right)
    {
        int tmp = arr[left];
        arr[left] = arr[right];
        arr[right] = tmp;
        left++;
        right--;
    }
}

int main()
{
    char arr[] = "abcdef";
    reverse_string(arr);
    printf("%s\n", arr);
    return 0;
}

这是循环方法来使用my_strlen。下面是递归方法

void reverse_string(char* arr)
{
    char tmp = arr[0];
    int len = my_strlen(arr);
    arr[0] = arr[len - 1];
    arr[len - 1] = '\0';
    if (my_strlen(arr + 1) >= 2)
        reverse_string(arr + 1);
    arr[len - 1] = tmp;
}

一个数的每位之和(递归实现)

写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和。

例如。调用这个函数,则应该返回1 + 7 + 2+ 9,它的和是19

输入1729,输出19

#include <string.h>

int DigitSum(unsigned int num)
{
    if (num > 9)
        return DigitSum(num / 10) + num % 10;
    else
        return num;
}

int main()
{
    unsigned int num = 0;
    scanf("%d", &num);
    int ret = DigitSum(num);
    printf("ret = %d\n", ret);
    return 0;
}

递归实现n的k次方

int Pow(int n, int k)
{
    if (k < 0)
        return (1.0 / (Pow(n, -k)));
    else if (k == 0)
        return 1;
    else
        return n * Pow(n, k - 1);
}

int main()
{
    int n = 0;
    int k = 0;
    int ret = Pow(n, k);
    printf("ret = %d\n", ret);
    return 0;
}

结束。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值