C语言刷题:整数加逗号、删除公共字符、求最小公倍数和将字符串倒置

简介: C语言刷题:整数加逗号、删除公共字符、求最小公倍数和将字符串倒置



一、整数加逗号

1.原题

对于一个较大的整数 N(1<=N<=2,000,000,000)

比如     980364535,我们常常需要一位一位数这个数字是几位数,但是如果在这 个数字每三位加一个逗号,它会变得更加易于朗读。因此,这个数字加上逗号成如下的模样:980,364,535请写一个程序帮她完成这件事情

样貌:题目意思就是每三位数就加一个逗号

原题:添加逗号_牛客题霸_牛客网

2.思路

  • 利用数组存放加了逗号之后的数字
  • 一位位存入数组中,每存放三位,就往数组中存放一个逗号
  • 利用%10得到最低位数字,/10去掉最低位的数字,从后往前存入数字
  • 再将数组逆序打印就可以得到目标

将每一位数字放入字符数组中,利用%10得到最后一位,/10去掉最后一位。最后再逆序打印数组即可。

3.完整代码

#include<stdio.h>
int main()
{
  int N = 0;//需要加逗号的数字
  scanf("%d",&N);
  char arr[15] = { 0 };
  int i = 0;
  int k = 0;//记录三位数
  while (N)
  {
    if (k != 0 && k % 3 == 0)
    {
      arr[i++] = ',';
    }
    arr[i++] = N % 10+'0';
    N = N / 10;//去掉最后一位
    k++;
  }
  //此时的i为指向数组的后一个位置,i==数组元素
  for (--i;i>=0;--i)
  {
    printf("%c",arr[i]);
  }
  return 0;
}

二、删除公共字符

1.题目

输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例如,输入”They are students.”和”aeiou”,则删除之后的第一个字符串变成”Thy r stdnts.”

样貌:

原题链接:删除公共字符_牛客题霸_牛客网

2.第一种解法

(1)思路

  • 定义三个数组,第一个是被查重的数组,第二个是存放标记的数组,第三个是存放删除公共字符串后的数组
char arr1[101] = { 0 };
  char arr2[101] = { 0 };
  char arr3[101] = { 0 };//存放重组后的字符
  scanf("%[^\n]s",arr1);//删除arr1中的字符
  getchar();//吸收回车字符
  scanf("%[^\n]s",arr2);//标记
  my_str(arr1,arr2,arr3);
  • 每遍历第一个数组中的一个字符,就需要遍历整个第二个数组,与第一个数组中的一个字符一一对照,若都不相等,则存放到第三个数组中
  • 每次对照结束,第二个数组的指针需要回到起始位置

(2)完整代码

#include<stdio.h>
void my_str(char* arr1,char* arr2,char* arr3)
{
  char* p1 = arr1;
  int i = 0;
  while (*p1 != '\0')//遍历第一个数组
  {
    int tmp = 1;
    char* p2 = arr2;//保证数组2每次回到起始位置
    while (*p2 != '\0')//遍历第二个数组
    {
      if (*p1 != *p2)
      {
        p2++;
      }
      else
      {
        tmp = 0;
        break;
      }
    }
    if (tmp)//不相等就存入第三个数组
    {
      arr3[i++] = *p1;
    }
    p1++;
  }
  printf("%s\n", arr3);
}
int main()
{
  char arr1[101] = { 0 };
  char arr2[101] = { 0 };
  char arr3[101] = { 0 };//存放重组后的字符
  scanf("%[^\n]s",arr1);//删除arr1中的字符
  getchar();//吸收回车字符
  scanf("%[^\n]s",arr2);//标记
  my_str(arr1,arr2,arr3);
  
  return 0;
}

3.第二种解法

(1)思路

  • 用gets读取字符串,定义两个数组即可
char arr1[101] = { 0 };
  char arr2[101] = { 0 };
  
  gets(arr1);
  gets(arr2);
  • 遍历第一个数组,用函数判断字符是否相等,相等则返回某个值,再打印出来
int i = 0;
  while (arr1[i])
  {
    if (my_str(arr1[i], arr2) == 0)
    {
      printf("%c",arr1[i]);
    }
    i++;
  }
  • 字符比较函数:同样需要一个个遍历
int my_str(char arr1,char arr2[])
{
  int i = 0;
  while (arr2[i++])
  {
    if (arr1 == arr2[i])
      return 1;
  }
  return 0;
}

(2)完整代码

#include<stdio.h>
int my_str(char arr1,char arr2[])
{
  int i = 0;
  while (arr2[i++])
  {
    if (arr1 == arr2[i])
      return 1;
  }
  return 0;
}
int main()
{
  char arr1[101] = { 0 };
  char arr2[101] = { 0 };
  
  gets(arr1);
  gets(arr2);
  int i = 0;
  while (arr1[i])
  {
    if (my_str(arr1[i], arr2) == 0)
    {
      printf("%c",arr1[i]);
    }
    i++;
  }
  return 0;
}

三、求最小公倍数

1.题目

正整数 a 和正整数 b 的最小公倍数,是指能被 a 和 b 整除的最小的正整数。请你求 a 和 b 的最小公倍数。

比如输入5和7,5和7的最小公倍数是35,则需要返回35。

全貌:

原题链接:求最小公倍数_牛客题霸_牛客网

2.第一种解法

(1)思路

  • 直接利用最小公倍数的性质:用来除那两个数都可以整除。
  • 其中最小的公倍数一定是他们其中最大的那个数;最大的最小公倍数一定是他们的乘积
  • 利用以上性质,不断循环和试除

(2)完整代码

#include<stdio.h>
int main()
{
  int a = 0, b = 0;
  scanf("%d%d",&a,&b);
  int max = a > b ? a : b;//找出大的数
  while (1)
  {
    if (max % a == 0 && max % b == 0)//从他们之间大的数开始
      break;//直到找到,退出循环
    max++;
  }
  printf("%d\n",max);
  return 0;
}

3.第二种解法

(1)思路

利用下面图片的原理

(2)完整代码

#include<stdio.h>
int main()
{
  int a = 0, b = 0;
  scanf("%d%d",&a,&b);
  int ret = 1;
  while (ret)
  {
    if (ret * a % b == 0)
      break;
    ret++;
  }
  printf("%d\n",ret*a);
  return 0;
}

四、倒置字符串

1.题目

将一句话的单词进行倒置,标点不倒置。比如 "I like beijing.",经过处理后变为:"beijing. like I"。字符串长度不超过100。

全貌:

链接:倒置字符串__牛客网链接:倒置字符串__牛客网

2.思路

我们有两种思路,第一种是先将整个字符串逆置,再将每个单词逆置;第二种就是先将每个单词逆置,最后再整体逆置。我们下面采用第一种。

(1)先逆置整个字符串

【输入字符串】

我们观察题目,发现字符串有多个空格,而我们的sacnf函数是不方便输入空格的,所以我们使用gets函数

如:

char arr[101] = { 0 };
  gets(arr);

【传参】

在写函数前,我们需要传参,也就是需要知道字符串的头跟尾,于是:

int len =strlen(arr);
  reverse(arr,arr+len-1);

【完成逆置字符串函数】

有了首位指针,我们就可以逐个交换,直到达到某个条件。下面的代码就是类型两个变量的交换,借助第三方,不断循环交换的过程:

void reverse(char* left,char* right)//逆置整个字符串
{
  while (left < right)
  {
    char tmp = *left;
    *left = *right;
    *right = tmp;
    left++;
    right--;
  }
}

条件的注意点:当只剩下一个字符没有被交换的时候,也就是left==right的时候,他们是不需要交换的。

(2)逆置每个单词

【传参】这次的传参就只需要传字符串的首地址即可

recerse(arr);
void recerse(char* ptr1)

【定位每个单词】

  • 现在我们需要逆置每个单词,把这个单词看成一个字符串(空格不需要逆置),所以需要找到这个单词的首跟尾
  • 因为每个单词后面不是空格就是\0,所以根据这两个条件找尾
  • 找到尾之后,需要记录尾后面的位置,方便下次找到下个单词

找尾:

char* left=ptr1;//头
  char* right = ptr1;//尾
  char* p = NULL;//记录空格或\0位置
while (*right != ' '&&*right!='\0')//找空格
    {
      right++;
    }
    p = right--;//找到了尾并记录空格位置

逆置该单词:直接调用刚才所撰写的逆置字符串函数即可,这就完成了一个单词的逆置

reverse(left, right);

逆置所有单词:这就需要用到循环

void recerse(char* ptr1) {
  char* left=ptr1;//头
  char* right = ptr1;//尾
  char* p = NULL;//记录空格位置
  while (*left!='\0')
  {
    while (*right != ' '&&*right!='\0')//找空格
    {
      right++;
    }
    p = right--;//记录尾
    reverse(left, right);
    left = right = ++p;//重新找下个单词的首部
  }
}

直到首部找到\0,程序结束

3.完整代码

#include<stdio.h>
#include<string.h>
void reverse(char* left,char* right)//逆置整个字符串
{
  
  while (left < right)
  {
    char tmp = *left;
    *left = *right;
    *right = tmp;
    left++;
    right--;
  }
}
//逆置每个单词
void recerse(char* ptr1) {
  char* left=ptr1;//头
  char* right = ptr1;
  char* p = NULL;//记录空格位置
  while (*left!='\0')
  {
    while (*right != ' '&&*right!='\0')//找空格
    {
      right++;
    }
    p = right--;
    reverse(left, right);
    left = right = ++p;
  }
}
int main()
{
  char arr[22] = { 0 };
  gets(arr);
  int len =strlen(arr);
  reverse(arr,arr+len-1);
  recerse(arr);
  printf("%s\n",arr);
  return 0;
}
相关文章
|
1月前
|
C语言 C++
【C语言】解决不同场景字符串问题:巧妙运用字符串函数
【C语言】解决不同场景字符串问题:巧妙运用字符串函数
|
1月前
|
机器学习/深度学习 编译器 C语言
C语言刷题(中)(保姆式详解)
C语言刷题(中)(保姆式详解)
14 0
|
2月前
|
存储 C语言
【C语言基础考研向】10 字符数组初始化及传递和scanf 读取字符串
本文介绍了C语言中字符数组的初始化方法及其在函数间传递的注意事项。字符数组初始化有两种方式:逐个字符赋值或整体初始化字符串。实际工作中常用后者,如`char c[10]=&quot;hello&quot;`。示例代码展示了如何初始化及传递字符数组,并解释了为何未正确添加结束符`\0`会导致乱码。此外,还讨论了`scanf`函数读取字符串时忽略空格和回车的特点。
|
2月前
|
存储 Serverless C语言
【C语言基础考研向】11 gets函数与puts函数及str系列字符串操作函数
本文介绍了C语言中的`gets`和`puts`函数,`gets`用于从标准输入读取字符串直至换行符,并自动添加字符串结束标志`\0`。`puts`则用于向标准输出打印字符串并自动换行。此外,文章还详细讲解了`str`系列字符串操作函数,包括统计字符串长度的`strlen`、复制字符串的`strcpy`、比较字符串的`strcmp`以及拼接字符串的`strcat`。通过示例代码展示了这些函数的具体应用及注意事项。
123 7
|
2月前
|
存储 人工智能 C语言
C语言程序设计核心详解 第八章 指针超详细讲解_指针变量_二维数组指针_指向字符串指针
本文详细讲解了C语言中的指针,包括指针变量的定义与引用、指向数组及字符串的指针变量等。首先介绍了指针变量的基本概念和定义格式,随后通过多个示例展示了如何使用指针变量来操作普通变量、数组和字符串。文章还深入探讨了指向函数的指针变量以及指针数组的概念,并解释了空指针的意义和使用场景。通过丰富的代码示例和图形化展示,帮助读者更好地理解和掌握C语言中的指针知识。
|
1月前
|
C语言 C++
C语言 之 内存函数
C语言 之 内存函数
34 3
|
C语言
《C语言及程序设计》实践参考——分离整数和小数部分
返回:贺老师课程教学链接  C语言及程序设计初步  项目要求 要求:编写一个程序,其功能为:从键盘上输入一个浮点数(小数点后有三位数),然后分别输出该数的整数部分和小数部分。样例输入:123.456样例输出:123 456 [参考解答] #include &lt;stdio.h&gt; int main() { float x; int a, b; scanf("%
1954 0
|
6天前
|
C语言
c语言调用的函数的声明
被调用的函数的声明: 一个函数调用另一个函数需具备的条件: 首先被调用的函数必须是已经存在的函数,即头文件中存在或已经定义过; 如果使用库函数,一般应该在本文件开头用#include命令将调用有关库函数时在所需要用到的信息“包含”到本文件中。.h文件是头文件所用的后缀。 如果使用用户自己定义的函数,而且该函数与使用它的函数在同一个文件中,一般还应该在主调函数中对被调用的函数做声明。 如果被调用的函数定义出现在主调函数之前可以不必声明。 如果已在所有函数定义之前,在函数的外部已做了函数声明,则在各个主调函数中不必多所调用的函数在做声明
22 6
|
26天前
|
存储 缓存 C语言
【c语言】简单的算术操作符、输入输出函数
本文介绍了C语言中的算术操作符、赋值操作符、单目操作符以及输入输出函数 `printf` 和 `scanf` 的基本用法。算术操作符包括加、减、乘、除和求余,其中除法和求余运算有特殊规则。赋值操作符用于给变量赋值,并支持复合赋值。单目操作符包括自增自减、正负号和强制类型转换。输入输出函数 `printf` 和 `scanf` 用于格式化输入和输出,支持多种占位符和格式控制。通过示例代码详细解释了这些操作符和函数的使用方法。
34 10
|
19天前
|
存储 算法 程序员
C语言:库函数
C语言的库函数是预定义的函数,用于执行常见的编程任务,如输入输出、字符串处理、数学运算等。使用库函数可以简化编程工作,提高开发效率。C标准库提供了丰富的函数,满足各种需求。