28.练习(初阶结束,下一篇开始进阶!)

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>

输入两个数字求它的最小公倍数
int main()
{
    int a = 0;
    int b = 0;
    scanf("%d %d", &a, &b);
    int j = 1;
    while (1)
    {
        if (j % a == 0 && j % b == 0)
        {
            printf("%d\n", j);
            break;
        }
        else
            j++;
    }
    return 0;
}

输入一句话,将它倒置
I like beijing
beijing like I
void reverse(char*left, char* right)
{
    char tmp = 0;
    while (left < right)
    {
        tmp = *left;
        *left = *right;
        *right = tmp;

        left++;
        right--;
    }
}

int main()
{
    char arr[100] = { 0 };
    gets(arr);
    //char * gets ( char *str );  
    //pointer to a block of memory (array of char) where the string reaf is copied as a C string
    
    //三步翻转法
    //1.字符串整体翻转
    int len = strlen(arr);
    reverse(arr, arr + len - 1);

    //2.没个单词逆序
    char* start = arr;
    while (*start)
    {
        char* end = start;
        while (*end != ' ' && *end != '\0')
        {
            end++;
        }
        reverse(start, end - 1);
        if (*end == ' ')
            start = end + 1;
        else
            start = end;
    }
    printf("%s\n", arr);
    return 0;
}

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

int main()
{
    int a, b, c;
    a = 5;
    c = ++a;
    b = ++c, c++, ++a, a++;
    b += a++ + c; 

    printf("%d %d %d", a, b, c);//a=9 b=23 c=8
    return 0;
}

写一个函数返回参数二进制中1的个数
123
123 % 10 = 3
123 / 10 = 12

15 % 2=1
15 / 2=7
7 % 2=1
7 / 2=3

负数无法用
int NumberOf1(int n)
{
    int count = 0;
    while (n)
    {
        if (n % 2 == 1)
        {
            count++;
        }
        n = 2;        //记得赋值
    }
    return count;
}
int NumberOf1(int n)
{
    int count = 0;
    int i = 0;
    for (i = 0;i < 32;i++)
    {
        if (((n >> i) & 1) == 1)
        {
            count++;
        }
    }
    return count;
}

int NumberOf1(int n)      //还可以优化
{
    int count = 0;
    int i = 0;
    while (n)
    {
        n = n & (n - 1);     //进行了几次就有几个1
        count++;
    }
    return count;
}
int main()
{
    int n = 15;
    int ret = NumberOf1(n);

    printf("ret = %d\n", ret);
    return 0;
}

写一个代码判断一个数字是不是2的n次方
2的n次方的数字,其实只有一个1
k & (k-1) == 0

判断两个int的数m和n,有几个二进制位不相同

int NumberOf1(int n)
{
    int count = 0;
    int i = 0;
    for (i = 0;i < 32;i++)
    {
        if (((n >> i) & 1) == 1)
        {
            count++;
        }
    }
    return count;
}
int main()//还可以优化
{
    int m = 0;
    int n = 0;
    int i = 0;
    int count = 0;
    scanf("%d %d", &m, &n);
    int ret = m ^ n; //相同为0,相异为1
                            //统计一下ret的2进制中有几个1,就说明m和n的二进制位中有几个位不同
    count = NumberOf1(ret);
    printf("%d\n", count);

    /*for (i = 0;i < 32;i++)
    {
        if (((m >> i) & 1) != ((n >> 1) & 1))
        {
            count++;
        }
    }
    printf("%d\n", count);*/

    return 0;
}

获取一个整数二进制序列中所有的偶数位和奇数位,分别打印出二进制序列
int main()
{
    int n = 0;
    scanf("%d", &n);
    //获取n的二进制中的奇数位和偶数位
    int i = 0;
    for (i = 31;i >= 1;i -= 2)
    {
        printf("%d ", (n >> i) & 1);
    }
    //打印奇数位
    for (i = 30;i >= 0;i -= 2)
    {
        printf("%d ", (n >> i) & 1);
    }
    return 0;
}

交换两个变量(不创建临时变量)
int main()
{
    int a = 10;
    int b = 20;
    a = a ^ b;  
    b = a ^ b;  //b = a 
    a = a ^ b;  //a^b^a
    printf("a==%d b==%d", a, b);
    return 0;
}

下列代码运行的结果是什么?
int main()
{
    int arr[] = { 1,2,3,4,5 };
    //10进制:1
    //2进制:00000000 00000000 00000000 00000001
    //16进制:00 00 00 01           小端存储
    //01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00 05 00 00 00
    short* p = (short*)arr;//如果地址是short类型, +1 后解引用2个字节
    int i = 0;
    for (i = 0;i < 4;i++)
    {
        *(p + i) = 0;
    }
    //00 00 00 00 00 00 00 00 03 00 00 00 04 00 00 00 05 00 00 00
    for (i = 0;i < 5;i++)
    {
        printf("%d ", arr[i]); //输出结果是 0 0 3 4 5
    }
    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值