C语言刷题(中)(保姆式详解)

简介: C语言刷题(中)(保姆式详解)

关于VS2022


调试技巧

步骤一

步骤二

快捷键在下图已标出

步骤三

先按F10开始调试,然后再按窗口,选择你所想看到的弹窗/按快捷键

关于Debug和Release版本区别

(1)Debug为调试版本,一般在开发完成后发布工程前,调试代码都是在Debug模式下进行的

(2)Release版本最终是要发送给用户的,发给用户的版本必须要没有问题,测试人员就是最后一个把关的

(3)Debug版本是调试版本,编译器编译时会增加一些调试信息,编译器基本不会对其进行优化

(4)Release版本不能调试的,一般都是在Debug版本下调试的,Release版本一般编译器会进行大量的优化,删除无用的代码,指令的次序调整等,让其速度更快


编程题


1.计算求和

Sn=a+aa+aaa+aaaa+aaaaa+...的前n项之和,其中a是一个数字

思路及总结

int main()
{
  int a = 0, n = 0;
  printf("请输入正整数a和n(a为数字,n为多少项的累加):");
  scanf("%d %d", &a, &n);
  int k = 0, i = 0, sum = 0;
  for (i = 0; i < n; i++)
  {
    k = k * 10 + a;
    sum += k;
  }
  printf("sum=%d\n", sum);
  return 0;
}

2.水仙花数

“水仙花数”是指一个n位数,其各位数字的n次方之和等于该数本身

如:153=1^3+5^3+3^3,则153是一个“水仙花数”。

1)判断数字位数

2)计算每一位数的次方和

3)最后求和sum判断与i是否相等(sum == i ?)

2) 一个数n

n % 10 = n的个位数

n / 10 = 表示n的小数点向前移动一位

while循环体条件为:temp,直至为0

int main()
{
  int i = 0;
  for (i = 0; i <= 999999; i++)
  {
    int count = 1;
    int temp = i;
    int sum = 0;
    //判断i是否为水仙花数
    //1. 求判断数字的位数
    while (temp / 10)
    {
      count++;
      temp = temp / 10;
    }
 
    //2. 计算每一位的次方和
    temp = i;
    while (temp)
    {
      sum += pow(temp % 10, count);
      temp = temp / 10;
    }
 
    //3. 判断
    if (sum == i)
      printf("%d ", i);
  }
  return 0;
}

3.打印菱形

#include <stdio.h>
int main()
{
  int line = 0;
  scanf("%d", &line);
 
  //上半部分
  int i = 0, j = 0;
  for (i = 0; i < line; i++)
  {
    //打印空格
    for (j = 0; j < line - 1 - i; j++)
    {
      printf(" ");
    }
    //*
    for (j = 0; j < 2 * i + 1; j++)
    {
      printf("*");
    }
    printf("\n");
  }
  //下半部分
  for (i = 0; i < line-1; i++)
  {
    //打印空格
    for (j = 0; j <= i; j++)
    {
      printf(" ");
    }
    //*
    for (j=0;j<2*(line-1-i)-1;j++)
    {
      printf("*");
    }
    printf("\n");
  }
  return 0;
}

4.喝汽水问题

喝汽水,1瓶汽水1元,2个空瓶可以换一瓶汽水,给20元,可以喝多少汽水

int main()
{
  int money = 0;
  int total = 0;
  int empty = 0;
 
 
  scanf("%d", &money);
 
  total = money;
  empty = money;
  while (empty > 1)
  {
    total += empty / 2;
    empty = empty / 2 + empty % 2;
  }
 
  printf("total = %d\n", total);
  return 0;
}


递归题组


(1)关于递归的描述

(2)打印一个整数的每一位

关于取得该整数的个位数 编程题2.水仙花数 2)已经解释过 (需要了解请往上翻阅)

int Print(int a)
{
  if (a > 9)
    Print(a / 10);
  printf("%d ", a % 10);
}
 
int main()
{
  int a = 0;
  printf("请输入一个整数:");
  scanf("%d", &a);
  Print(a);
  printf("\n");
  return 0;
}

(3)求阶层

①递归方式

int jiec(int n)
{
  if (n == 0 || n == 1)
    return 1;
  if (n >= 2)
    return n * jiec(n - 1);
}
 
int main()
{
  int n = 0;
  printf("请输入一个非负整数:");
  scanf("%d", &n);
  int result = jiec(n);
  printf("result=%d\n", result);
  return 0;
}

②非递归方式

int main()
{
  int n = 0;
  int ret = 1, i = 0;
  printf("请输入一个非负整数:");
  scanf("%d", &n);
  if (n == 0 || n == 1)
    printf("result=1\n");
  else
  {
    for (i = 2; i <= n; i++)
    {
      ret *= i;
    }
    printf("result=%d\n", ret);
  }
  return 0;
}

(4)计算一个数的每位之和

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

例:调用DigitSum(1729),则应该返回1+7+2+9=19

int DigitSum(n)
{
  if (n > 0)
    return n % 10 + DigitSum(n / 10);
  else
    return 0;
}
 
int main()
{
  int n = 0;
  printf("请输入一个非负整数:");
  scanf("%d", &n);
  int result = DigitSum(n);
  printf("result=%d\n", result);
  return 0;
}

(5) n的k次方

int pow(int n, int k)
{
  if (k>1)
    return n * pow(n, k - 1);
  else
    return n;
}
 
int main()
{
  int n = 0, k = 0;
  printf("请输入一个n和k:");
  scanf("%d %d", &n,&k);
  int ret = pow(n, k);
  printf("result=%d\n", ret);
  return 0;
}

(6)

这题的结果是什么呢?


操作符讲解


(1)进制位的转化

(2)原码,反码,补码

(3)按位异或^

(4)按位或与&

编程题

(1)交换两个变量


注:不创建临时变量!!!

总结:(a^b)^a=b

int main()
{
  int a = 0, b = 0;
  scanf("%d %d", &a, &b);
  printf("a=%d b=%d\n", a, b);
  a = a ^ b;
  b = a ^ b;
  a = a ^ b;
  printf("a=%d b=%d\n", a, b);
  return 0;
}

(2)统计二进制中1的个数

①第一种方法
int main()
{
  int a = 0;
  printf("请输入一个整数:");
  scanf("%d", &a);
  int i = 0, count = 0;
  for (i = 1; i <= 32; i++)
  {
    if ((a >> i) & 1 == 1)
    {
      count++;
    }
  }
  printf("count=%d\n", count);
  return 0;
}
②第二种方法
int count_one_bit(unsigned int n)  //unsigned无符号类型,当输入是负数,保证二进制的补码是有效位
{
  int count = 0;
  while (n)
  {
    if (n % 2 == 1)            //因为是计算机存储的码为二进制,%2得到补码最后一位,在while再/2得到上一位
      count++;
    n /= 2;
  }
  return count;
}
 
int main()
{
  int num = 0;
  scanf("%d", &num);
  int n = count_one_bit(num);
  printf("%d\n", n);
  return 0;
}
目录
相关文章
|
4月前
|
C语言
【C语言刷题系列】合并两个有序数组
【C语言刷题系列】合并两个有序数组
|
2月前
|
存储 C语言
【C语言】基础刷题训练4(含全面分析和代码改进示例)
【C语言】基础刷题训练4(含全面分析和代码改进示例)
|
2天前
|
C语言 C++
保姆式教学C语言——数组
保姆式教学C语言——数组
7 0
保姆式教学C语言——数组
|
4月前
|
C语言
【C语言刷题系列】删除公共元素
【C语言刷题系列】删除公共元素
|
4月前
|
存储 C语言
【C语言刷题系列】对数字添加逗号
【C语言刷题系列】对数字添加逗号
|
4月前
|
C语言
【C语言刷题系列】喝汽水问题
【C语言刷题系列】喝汽水问题
|
2天前
|
机器学习/深度学习 C语言
C语言必刷题上(保姆式详解)
C语言必刷题上(保姆式详解)
6 0
|
2月前
|
C语言
【C语言刷题训练】——第7节(含代码与分析思路)
【C语言刷题训练】——第7节(含代码与分析思路)
|
2月前
|
测试技术 C语言 C++
【C语言刷题训练——6】鹏哥C语言刷题训练营笔记,含代码讲解改进
【C语言刷题训练——6】鹏哥C语言刷题训练营笔记,含代码讲解改进
|
2月前
|
存储 C语言
【C语言】鹏哥C语言刷题训练营——第5节内容笔记(含代码全面分析和改进,讲解)
【C语言】鹏哥C语言刷题训练营——第5节内容笔记(含代码全面分析和改进,讲解)