4个小练习(确定凶手__奇偶位交换__杨氏矩阵__字符串旋转)

1.日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个嫌疑犯
的一个。以下为4个嫌疑犯的供词。
A说:不是我。
B说:是C。
C说:是D。
D说:C在胡说
已知3个人说了真话,1个人说的是假话。
现在请根据这些信息,写一个程序来确定到底谁是凶手。

#include <stdio.h>  
int main()
{
    int murderer;
    for (murderer = 'A'; murderer <= 'D'; murderer++)
    {
        /*三真一假,在if语句的,括号里为真结果为1,要是假结果为0。
        因此if括号  后面若成立,必定为三真一假,即必定等于3.  */
        if (((murderer != 'A') + (murderer == 'C') +
         (murderer == 'D') + (murderer != 'D')) == 3)
        {
            printf("murderer is %c\n", murderer);
        }
    }
    printf("\n");
    system("pause");
    return 0;
}

程序输出:
这里写图片描述


2.写一个宏可以将一个数字的奇数位和偶数位交换。

#include<stdio.h>
#define CHANGE(X)\
    (((X&(0x55555555)) << 1) | ((X&(0xAAAAAAAA)) >> 1))
int main()
{
    int x = 5;
    printf("%d\n", CHANGE(x));   //5的二进制:0101 交换后得二进制:1010其值为10
    system("pause");
    return 0;
}

程序输出:
这里写图片描述


3.杨氏矩阵
有一个二维数组.数组的每行从左到右是递增的,
每列从上到下是递增的,在这样的数组中查找一个数字是否存在。
时间复杂度小于O(N);

数组:
1 2 3
2 3 4
3 4 5

1 3 4
2 4 5
4 5 6

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#define ROW 3
#define COL 3

int Judge(int arr[ROW][COL], int value)
{
    int i = 0;
    int j = COL - 1;
    int temp = arr[i][j];
    while (1)
    {
        if (temp == value)
        {
            return 1;
        }
        else if (temp < value && j >= 0)
        {
            temp = arr[++i][j];
        }
        else if (temp > value && j >= 0)
        {
            temp = arr[i][--j];
        }
        else
        {
            return 0;
        }
    }
}
int main()
{
    int arr[ROW][COL] = { 1, 3, 4, 2, 4, 5, 4, 5, 6 };
    int i = 0;
    int j = 0;
    int value;
    int ret;
    printf("数组为:\n");
    for (i = 0; i < ROW; i++)
    {
        for (j = 0; j < COL; j++)
        {
            printf("%5d", arr[i][j]);
        }
        printf("\n");
    }
    printf("请输入一个数:\n");
    scanf("%d", &value);
    if (ret = Judge(arr, value))
    {
        printf("%d在数组中\n", value);
    }
    else
    {
        printf("%d不在数组中\n", value);
    }
    system("pause");
    return 0;
}

程序输出:
这里写图片描述


4.判断一个字符串是否为另外一个字符串旋转之后的字符串。
例如:给定s1 = AABCD和s2 = BCDAA,返回1,给定s1 = ABCD和s2 = ACBD,返回0.
AABCD左旋一个字符得到ABCDA
AABCD左旋两个字符得到BCDAA
ABCD右旋一个字符得到DAABC

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

int isturn(char *str, char *sub)
{
    char *p = malloc(strlen(str) + strlen(str) + 1);
    strcpy(p, str);
    strcat(p, str);
    if (strstr(p, sub) == NULL)
        return 0;
    return 1;
}
int main()
{
    char buf[] = "abcdef";
    char sub[] = "cdefab";
    if (isturn(buf, sub) == 0)
    {
        printf("不是\n");
    }
    else
    {
        printf("是\n");
    }
    system("pause");
    return 0;
}

程序输出:
这里写图片描述


猜你喜欢

转载自blog.csdn.net/zhang21722668/article/details/81588470