C语言进阶---------作业复习

简介: C语言进阶---------作业复习

选择题

解法:

编程题

题目:一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。


编写一个函数找出这两个只出现一次的数字。


例如:


有数组的元素是:1,2,3,4,5,1,2,3,4,6


只有5和6只出现1次,要找出5和6.

思路:

(1)暴力求解:遍历

(2):

我们可以拆成两个组,一个组存储有5 ,另一个组存储有6

首先我们可以先把整个数组进行异或操作

18e825bd698fa3f2c8621ace5c8072af_5c81306b92164bd19ff3e94e32eb1cb1.png

上图我们可以看到不同的位置上的异或操作的结果是1,那我们可以通过一个位置来区分,让二进制的该位置的数为1分成一组,不为1的分成另外一组,这样就可以分开

#include<stdio.h>
int main()
{
  int arr[] = { 1,2,3,4,5,6,1,2,3,4 };
  int i = 0;
  int sum = 0;//全部异或的结果
  for (i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
  {
    sum ^= arr[i];
  }
  int sum1 = sum;
  int sum2 = sum;
  int size = 0;
  //统计出第几位为1
  while (!(sum & 1))
  {
    sum = sum >> 1;
    size++;
  }

  for (i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
  {
    if ((arr[i] >> size) & 1)
    {
      sum1 ^= arr[i];//计算出其中一个
    }
  }
  printf("%d %d", sum1, sum1 ^ sum2);
  return 0;
}

offsetof宏

写一个宏,计算结构体中某变量相对于首地址的偏移,并给出说明

考察:offsetof宏的实现

思路:我们可以把一个数转换成对应的结构体初始地址,然后返回对应成员的地址

#include<stdio.h>

#include<stddef.h>

#define MYOFFSEROF(type, mem) (size_t)(&(((type*)0)->mem)) //把0转变成这个结构体指针类型

struct S

{

  int a;

  char b;

};

int main()

{

  printf("%d", offsetof(struct S, b));

  printf("%zd", MYOFFSEROF(struct S, b));



  return 0;

}

交换奇偶位

写一个宏,可以将一个整数的二进制位的奇数位和偶数位交换。

一个数之和=奇数位之和 + 偶数位之和

我们要获取一个数的奇数位 可以 与(&)上0x55555555 ,偶数位与(&)上0xaaaaaaaa

#include<stdio.h>
#define EXCHENG(a) (((a & 0x55555555)<<1) +((a & 0xaaaaaaaa)>>1))
int main()
{
  int a = 10;

  a = EXCHENG(a);
  printf("%d", a);

  return 0;
}

添加逗号

这道题的思路:

我们可以举例如 1,333,333 22,333,333 333,333,333 这三种情况,控制好间距就可以很好解决

#include <stdio.h>
#include<stdlib.h>
#include<string.h>
int main() {
    long long num = 0;
    scanf("%d", &num);
    char *str = (char*)malloc(sizeof(char) * 14);
    sprintf(str, "%d", num);
    int size = strlen(str);
    int sub = size % 3;
    int i = 0;
    //防止前面不满
    if(sub)
    {
        for(;i < sub; i++)
        {
            printf("%c", str[i]);
        }
        if(sub != size)
            printf(",");
    }
    int count = 0;
    for(; i < size;i++)
    {
        if(count == 3)
        {
            printf(",");
            count = 0;
        }
        count += printf("%c", str[i]);

    }
    free(str);
    return 0;
}

删除公共字符

思路很简单就是在字符串里面找出相同的不打印,然后不同的打印出来

#include <stdio.h>
#include<stdlib.h>
#include <string.h>
int main() 
{
    char *str1 = (char*)malloc(sizeof(char)* 1000);
    char *str2 = (char*)malloc(sizeof(char)* 1000);
    gets(str1);
    gets(str2);
    int size = strlen(str1);
    int i = 0;
    int size1 = strlen(str2);
    for (i = 0; i < size;i++)
    {
        int j = 0;
        for (j = 0; j < size1; j++)
        {
            if(str1[i] == str2[j])
            {
                break;
            }
        }
        if(j == size1)
            printf("%c", str1[i]);
    }
    free(str1);
    free(str2);
    return 0;
}
相关文章
|
19小时前
|
存储 C语言
C语言进阶⑮(自定义类型)(结构体+枚举+联合体)(结构体实现位段)(中)
C语言进阶⑮(自定义类型)(结构体+枚举+联合体)(结构体实现位段)
7 0
|
19小时前
|
C语言 C++
C语言进阶⑭(内存函数_以字节操作)momcpy+mommove+memcmp+memset
C语言进阶⑭(内存函数_以字节操作)momcpy+mommove+memcmp+memset
5 0
|
19小时前
|
C语言
C语言进阶⑬(字符串函数)+(指针编程题)strlen+strcpy+strcat+strstr+strtok+strerror(下)
C语言进阶⑬(字符串函数)+(指针编程题)strlen+strcpy+strcat+strstr+strtok+strerror
5 0
|
19小时前
|
安全 C语言
C语言进阶⑬(字符串函数)+(指针编程题)strlen+strcpy+strcat+strstr+strtok+strerror(中)
C语言进阶⑬(字符串函数)+(指针编程题)strlen+strcpy+strcat+strstr+strtok+strerror
10 0
|
19小时前
|
C语言
C语言进阶⑫(指针下)(指针和数组笔试题解析)(杨氏矩阵)(中)
C语言进阶⑫(指针下)(指针和数组笔试题解析)(杨氏矩阵)
11 0
|
19小时前
|
C语言
C语言进阶⑫(指针下)(指针和数组笔试题解析)(杨氏矩阵)(上)
C语言进阶⑫(指针下)(指针和数组笔试题解析)(杨氏矩阵)
10 0
|
19小时前
|
编译器 C语言
C语言进阶⑪(指针上)(知识点和对应练习)回调函数模拟实现qsort。(下)
C语言进阶⑪(指针上)(知识点和对应练习)回调函数模拟实现qsort。
6 0
|
19小时前
|
存储 C语言
C语言进阶⑪(指针上)(知识点和对应练习)回调函数模拟实现qsort。(中)
C语言进阶⑪(指针上)(知识点和对应练习)回调函数模拟实现qsort。
8 0
|
19小时前
|
存储 C语言
C语言进阶⑩(数据的存储)数据类型_介绍+存储_大小端(知识点+笔试题)(下)
C语言进阶⑩(数据的存储)数据类型_介绍+存储_大小端(知识点+笔试题)
7 0
|
19小时前
|
存储 编译器 C语言
C语言进阶⑩(数据的存储)数据类型_介绍+存储_大小端(知识点+笔试题)(中)
C语言进阶⑩(数据的存储)数据类型_介绍+存储_大小端(知识点+笔试题)
8 0