刷题笔记(2)

简介: 刷题笔记(2)

1、

答案:C

解析:


(1)程序本来是想循环10次,当i==5时打印。

      但是在C语言中,‘=’是赋值,‘==’才是相等。(建议当要比较一个变量和一个常量是否相等,将变量放在‘==’的右边)


(2)在循环体中要尤其注意循环变量的修改。

补充:建议不要再for循环体中修改循环变量,防止for循环失去控制。


2、

答案:C

解析:

(1)if语句后面只能控制一条语句,但不是只能跟一条语句----->也能跟多条语句,注:跟多条语句时 需要用{}括起来

(2)if语句中0表示假,非0表示真。

(3)if语句是一种分支语句,可以实现单分支,也可实现多分支

补充:多分支选择语句:有switch语句和if多分支语句

        但如果分支较多,则if语句的层数多,程序冗长而且可读性降低。

        所以多分支语句,我们常常用switch语句。

(4)else的配匹:else总是与它前面最近的一个尚未匹配的if相匹配。

  3、

答案 :D


解析:


由func(1)可知,在调用函数func时形参a的值是1。


1、switch语句(也可叫开关语句)

(1)switch后的表达式必须为整形表达式(和枚举类型)

char类型虽然叫:字符类型

但是字符的存储是ASCII码值,是整形,所以char也是整形家族的!!!

(2)功能:先算出表达式的值,然后依次与case标签的值进行匹配,匹配成功(相等)就选择这个标签作为入口,执行该case字句后面的语句块,如果语句块没有加break,就会继续执行当前case之后的所有case子句直到程序结束。

注:break在switch语句中的作用:实现真正的分支

(3)当 switch 表达式的值并不匹配所有 case 标签的值时,这个时候结构的所有语句都被跳过,程序并不会终止,也不会报错。但是,如果你不想忽略不匹配所有标签的表达式的值,你可以在语句列表中加一条default子句。

default子句的作用:

当 switch 表达式的值并不匹配所有 case 标签的值时,则执行default子句后面的语句。所以,每个 switch 语句中只能出现一条 default 子句。

但是它可以出现在语句列表的任何位置,而且语句流会像执行一个 case 标签一样执行 default 子句。

(4)编程好习惯

①在每个 switch 语句中都放一条 default 子句是个好习惯,甚至可以在后边再加一个 break 。

②虽然default子句可以凡在任意地方,但建议放在最后(习惯上我们前面处理正确的,后面处理异常的)

(5)switch语句中的关键字:break,case,default,(注:continue只在循环出现)

4、

倍数:一个数能被另一个整数整除(%==0),那么这个整数就是另一整数的倍数。

//代码1
#include<stdio.h>
int main()
{
  int i = 0;
  for (i = 1; i <= 100; i++)
  {
    if (i % 3 == 0)
    {
      printf("%d ", i);
    }
  }
  return 0;
}
//代码2
#include<stdio.h>
int main()
{
  int i = 0;
  //3的倍数:3,6,9,12....我们发现每次都加3
  for (i = 3; i <= 100; i+=3)
  {
    printf("%d ", i);
  }
  return 0;
}
//代码3
#include<stdio.h>
int main()
{
  int i = 0;
  //3的倍数:3=3*1,6=3*2,9=3*3.....
  for (i = 1; 3 * i <= 100; i++)
  {
    printf("%d ", 3 * i);
  }
  return 0;
}

代码有好坏,代码2、3比代码1的效率更好

5、


#include<stdio.h>
int main()
{
  //1、先定义三个整形变量
  int a = 0;
  int b = 0;
  int c = 0;
  //2、输入
  scanf("%d %d %d",&a,&b,&c);
  //3、调整
  //最大值放a,最小值放c,其余放b
  if (a < b)
  {
    int t = a;
    a = b;
    b = t;
  }//互换
  if (a < c)
  {
    int t = a;
    a = c;
    c = t;
  }
  if (b < c)
  {
    int t = b;
    b = c;
    c = t;
  }
  //输出
  printf("%d %d %d\n", a, b, c);
  return 0;
}

两个数互换:注:要一个中间变量,不能直接互换

就如生活中酱油和醋互换


6、


质数:质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。

//写一个代码:打印100~200之间的素数
//素数-只能被1和它本身整除的数
//n是否素数 不能被2-n-1整除
//代码1
#include<stdio.h>
int main()
{
  int i = 0;
  //先打印100-200的数
  for (i = 100; i <= 200; i++)
  {
    //判断i是否为素数
    //拿2-(i-1)之间的数试除
    int flag = 1;//假如是素数
    int j = 0;
    for (j = 2; j <= (i - 1); j++)
    {
      if (i % j == 0)
      {
        flag = 0;
        break;
      }
    }
    if (1 == flag)
    {
      printf("%d ", i);
    }
  }
  return 0;
}
//代码2
#include<math.h>//math.h是sqrt库函数的头文件
#include<stdio.h>
int main()
{
  int i = 0;
  //先输出100-200的数,质数不可能是偶数
  for (i = 101; i <= 200; i += 2)
  {
    //判断是否是素数
    //i=a*b,a和b至少一个<=开平方i的
    //拿2-开平方i之间的数试除
    int j = 0;
    int flag = 1;//假如是素数
    for (j = 2; j <= sqrt(i); j++)//sqrt是开平方的库函数
    {
      if (i % j == 0)
      {
        flag = 0;
        break;
      }
    }
    if (1 == flag)
    {
      printf("%d ", i);
    }
  }
  return 0;
}

代码2比代码1效率更好


注:偶数不可能是质数,(奇数=奇数+2)


sqrt是开平方的库函数

它的头文件:“math.h”


判断质数:试除法

n是否是质数:n是否能整除2到n-1

优化:m=a*b,a和b至少一个数字是<=开平方m的

n是否能整除2到开平方n


//代码3
#include<stdio.h>
int main()
{
  int i = 0;
  //外层循环用来获取100-200的数,100必不是素数
  for (i = 101; i <= 200; i += 2)
  {
    //判断是否为素数
    //第二大因数<=i/2
    int j = 0;
    int flag = 1;//假如是素数
    for (j = 2; j <= i / 2; j++)
    {
      if (i % j == 0)
      {
        flag = 0;
        break;//注:一个break只能跳出一层循环
      }
    }
    //内层循环结束之后,若flag==1,说明[2,i/2]之间的数都不能被i整除,说明i为素数
    if (1==flag)
    {
      printf("%d ", i);
    }
  }
  return 0;
}

这只是提供了一些方法,也不是最优的

更优的:有兴趣可以去搜《素数求解的N种境界》

7、


闰年的条件:

1、如果N能够被4整除,并且不能被100整除,则是闰年

2、或者:N能被400整除,也是闰年

即:4年一润并且百年不润,每400年再润一次

//代码1
#include<stdio.h>
int main()
{
  int year = 0;
  //获取1000-2000的数
  for (year = 1000; year <= 2000; year++)
  {
    //判断是否为闰年
    //1、4年一润并且百年不润
    if (year % 4 == 0)
    {
      if (year % 100 != 0)
      {
        printf("%d ", year);
      }
    }
    //2、每400年再润一次
    if (year % 400 == 0)
    {
      printf("%d ", year);
    }
  }
  return 0;
}
//代码2
#include<stdio.h>
int main()
{
  int year;
  //获取1000-2000闰年的数,
  for (year = 1000; year <= 2000; year++)
  {
    if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0))
    {
      printf("%d ", year);
    }
  }
  return 0;
}

8、

最大公约数:最大能整除它两的数

最大公约数<=这两个数的较小值

//代码1
#include<stdio.h>
int main()
{
  int n = 0;
  int m = 0;
  //输入
  scanf("%d %d", &n, &m);//18 24
  //假设最大公约数就是m和n的较小值
  int k = (n < m ? n : m);
  while (1)
  {
    if (n % k == 0 && m % k == 0)
    {
      break;
    }
    k--;
  }
  printf("%d ", k);
  return 0;
}
//代码2
//辗转相除法求最大公约数
#include<stdio.h>
int main()
{
  int n = 0;
  int m = 0;
  //输入
  scanf("%d %d", &n, &m);//18 24
  int k = 0;//
  while (k = n % m)
  {
    n = m;
    m = k;
  }
  printf("%d ", m);
  return 0;
}

辗转相除法(体现结果是以相除余数为0则得到)

算法步骤:

1、输入两个正整数n,m

2、计算n除以m的余数k

3、n=m,m=k

4、若k=0,则m和n的最大公约数等于m;否则转到第2步

5.输出最大公约数m


最小公倍数:

n和m的最小公倍数=n*m/最大公约数

//最小公倍数
#include<stdio.h>
int main()
{
  int n = 0;
  int m = 0;
  scanf("%d %d", &n, &m);//18 24
  //求最大公约数
  int c = n * m;
  int k = 0;//n%m=k
  while (k = n % m)
  {
    n = m;
    m = k;
  }
  //最小公倍数=c/m
  printf("%d\n", c / m);
  return 0;
}


相关文章
|
9月前
两个复习技巧【笔记】
两个复习技巧【笔记】
31 0
|
8月前
|
SQL 存储 数据库
第5章 数据库完整性——复习笔记
第5章 数据库完整性——复习笔记
|
9月前
|
C语言
|
10月前
日常刷题篇(入门)
我从简单到难,一起走上漫漫刷题路! 我会持续在我的博客中更新我每天刷题的内容! 相互交流!
数据结构与算法题库
数据结构与算法题库
|
算法
【牛客刷题-算法】3-第一篇-斐波拉契数列-C实现
【牛客刷题-算法】3-第一篇-斐波拉契数列-C实现
75 0
【牛客刷题-算法】3-第一篇-斐波拉契数列-C实现
|
前端开发 JavaScript 测试技术
牛客前端宝典——刷题 ##Day12
🏆编程就像我们平常做题一样,如果只是一味的学习不去做题的话所得到的效果微乎其微。
129 0
牛客前端宝典——刷题 ##Day12
|
前端开发 容器
牛客前端宝典——刷题 ##Day7
🏆编程就像我们平常做题一样,如果只是一味的学习不去做题的话所得到的效果微乎其微。
牛客前端宝典——刷题 ##Day7
|
C++
学习C++笔记386
C++ 预处理器
137 0