C语言之操作符的使用必备练习题

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
简介: C语言之操作符的使用必备练习题

1.


作业标题


求两个数二进制中不同位的个数


链接:两个整数二进制位不同个数__牛客网

来源:牛客网


[编程题]两个整数二进制位不同个数


输入两个整数,求两个整数二进制格式有多少个位不同


输入描述:


两个整数

输出描述:


二进制不同位的个数


示例1


输入

22 33

输出

5

参考代码为:


#include <stdio.h>
int main()
{
  int m, n, num = 0;
  printf("请输入两个整数:\n");
  scanf_s("%d %d", &m, &n);
  //位异或操作,仅有对应位相异才为1,其他全为0
  //只要判断出来操作之后的数
  //其二进制数中有几个1即可
  num = m ^ n;
  int count = 0;
  for (int i = 0; i < 33; i++)
  {
  if (num & 1 == 1)
  {
    count++;
  }
  num = num >> 1;
  }
  printf("%d", count);
  return 0;
}

代码的运行结果为:


0a2653c851af460fa595bd959398a8f1.png


2.


作业标题(701)


下面哪个是位操作符:( )


作业内容


A.&


B.&&


C.||


D.!


答案解析:


A. & 是按位与操作符,正确


B. && 是逻辑与,不是按位与,错误


C. || 是逻辑或,错误


D. ! 是逻辑反操作符,错误


3.


下面代码的结果是:( )


#include <stdio.h>
int main()
{
  int a, b, c;
  a = 5;
  c = ++a;
  b = ++c, c++, ++a, a++;
  b += a++ + c;
  printf("a = %d b = %d c = %d\n:", a, b, c);
  return 0;
}

作业内容


A.a = 8 b = 23 c = 8


B.a = 9 b= 23 c = 8


C.a = 9 b = 25 c = 8


D.a = 9 b = 24 c = 8


答案解析:


++运算符:分为前置++和后置++,


前置++:先加1,后使用,即先使用变量中内容,然后给结果加1


后置++:先使用变量中内容,整个表达式结束时,给变量加1


逗号表达式,取最后一个表达式的值。


#include <stdio.h>
int main()
{
  int a, b, c;
  a = 5;
  c = ++a;// ++a:加给a+1,结果为6,用加完之后的结果给c赋值,因此:a = 6  c = 6
  b = ++c, c++, ++a, a++;
   // 逗号表达式的优先级,最低,这里先算b=++c, b得到的是++c后的结果,b是7
   // b=++c 和后边的构成逗号表达式,依次从左向右计算的。
   // 表达式结束时,c++和,++a,a++会给a+2,给c加1,此时c:8,a:8,b:7
  b += a++ + c; // a先和c加,结果为16,在加上b的值7,比的结果为23,最后给a加1,a的值为9
  printf("a = %d b = %d c = %d\n:", a, b, c); // a:9, b:23, c:8
  return 0;
}

4.


作业标题(704)


交换两个变量(不创建临时变量)


作业内容


不允许创建临时变量,交换两个整数的内容


参考代码为:


#include<stdio.h>
int main()
{
  int a = 2;
  int b = 3;
  printf("交换前:a=%d b=%d\n", a, b);
  b = a ^ b;
  a = a ^ b;//这里等于a=a^a^b=b,
    //       a^a=0,b^0=b
  b = a ^ b;//同理展开b=b^a^b=a
  printf("交换后:a=%d b=%d\n", a, b);
  return 0;
}

代码的运行结果为:


2d65d23f6d4748949b924e4057485923.png


5。


作业标题(705)


统计二进制中1的个数


作业内容


写一个函数返回参数二进制中 1 的个数。


比如: 15    0000 1111    4 个 1


参考代码为:


//统计二进制中1的个数
#include <stdio.h>
int sumone_third(int n)
{
  int count = 0;
  while (n)
  {
  n = n & (n - 1);
  count++;
  }
  return count;
}
int main()
{
  int n = 0;
  scanf_s("%d", &n);
  printf("%d\n", sumone_third(n));
  return 0;
}

代码的运行结果为:


6de278e6d6694ce5bb08e7e842b7e74b.png


6.


作业标题(710)


下面代码的结果是:( )


#include <stdio.h>
int main()
{
    int i = 1;
    int ret = (++i)+(++i)+(++i);
    printf("ret = %d\n", ret);
  return 0;
}

作业内容


A.10


B.12


C.9


D.程序错误


答案解析:


表达式(++i)+(++i)+(++i),只有操作符的优先级和结合性,没法确定唯一计算路径


所以这个表达式可能因为计算顺序的差异导致结果是不一致的,所以表达式是错误的表达式。


可以在VS和Linux gcc测试,结果可能有差异。


7.


下面代码的结果是:


#include <stdio.h>
int i;
int main()
{
    i--;
    if (i > sizeof(i))
    {
        printf(">\n");
    }
    else
    {
        printf("<\n");
    }
    return 0; 
}


作业内容


A.>


B.<


C.不输出


D.程序有问题



答案解析:


C语言中,0为假,非0即为真。


全局变量,没有给初始值时,编译其会默认将其初始化为0。


i的初始值为0,i--结果-1,i为整形,sizeof(i)求i类型大小是4,按照此分析来看,结果应该选择B,但是sizeof的返回值类型实际为无符号整形,因此编译器会自动将左侧i自动转换为无符号整形的数据,-1对应的无符号整形是一个非常大的数字,超过4或者8,故实际应该选择A


这道题其实很隐蔽,真是虾仁猪心!!!


因此:选择A


8.


关于表达式求值说法不正确的是:( )


作业内容


A.表达式求值先看是否存在整形提升或算术转换,再进行计算


B.表达式真正计算的时候先看相邻操作符的优先级决定先算谁


C.相邻操作符的优先级相同的情况下,看操作符的结合性决定计算顺序


D.只要有了优先级和结合性,表达式就能求出唯一值


答案解析:


A:正确


B:正确


C:正确


D: 错误,有了优先级和结核性,表达式也有可能有不同的计算机路径,导致计算结果的差异


9.


作业标题(706)


打印整数二进制的奇数位和偶数位


作业内容


获取一个整数二进制序列中所有的偶数位和奇数位,分别打印出二进制序列


参考代码为:


#include<stdio.h>
void Printbit(int num)
{
  for (int i = 31; i >= 1; i -= 2)
  {
  printf("%d ", (num >> i) & 1);
  }
  printf("\n");
  for (int i = 30; i >= 0; i -= 2)
  {
  printf("%d ", (num >> i) & 1);
  }
  printf("\n");
}
int main()
{
  int num = 0;
  printf("请输入一个数: ");
  scanf("%d", &num);
  Printbit(num);
  return 0;
}


代码的运行结果为:


12c3b7f3f8814309a195c64f051d4445.png


另一种思路为:


/*

思路:

1. 提取所有的奇数位,如果该位是1,输出1,是0则输出0

2. 以同样的方式提取偶数位置

检测num中某一位是0还是1的方式:

  1. 将num向右移动i位

  2. 将移完位之后的结果与1按位与,如果:

     结果是0,则第i个比特位是0

     结果是非0,则第i个比特位是1

*/
void Printbit(int num)
{
  for(int i=31; i>=1; i-=2)
  {
  printf("%d ", (num>>i)&1);
  }
  printf("\n");
  for(int i=30; i>=0; i-=2)
  {
  printf("%d ", (num>>i)&1);
  }
  printf("\n");
}


10


上三角矩阵判定



描述

KiKi想知道一个n阶方矩是否为上三角矩阵,请帮他编程判定。上三角矩阵即主对角线以下的元素都为0的矩阵,主对角线为从矩阵的左上角至右下角的连线。


输入描述:

第一行包含一个整数n,表示一个方阵包含n行n列,用空格分隔。 (1≤n≤10)


从2到n+1行,每行输入n个整数(范围-231~231-1),用空格分隔,共输入n*n个数。


输出描述:

一行,如果输入方阵是上三角矩阵输出"YES"并换行,否则输出"NO"并换行。


示例1

输入:


3

1 2 3

0 4 5

0 0 6

输出:


YES

参考代码为:


#include <stdio.h>
int main()
{
    int n = 0;
    scanf("%d",&n);
    int i,j;
    int arr[10][10] = {0};
    for(i=0; i<n;i++)        //输入数组元素
    {
        for(j=0;j<n;j++)
        {
            scanf("%d",&arr[i][j]);
        }
    }
    for(i=0; i<n;i++)
    {
        for(j=0;j<i;j++)
        {
            if(arr[i][j] != 0)
            {
                printf("NO\n");
                return 0;
            }
        }
    }
    printf("YES\n");
    return 0;
}


代码的运行结果为:


34e8d716411043c08c7ffba9fbba23de.png



11.


小乐乐与进制转换



描述

小乐乐在课上学习了二进制八进制与十六进制后,对进制转换产生了浓厚的兴趣。因为他的幸运数字是6,所以他想知道一个数表示为六进制后的结果。请你帮助他解决这个问题。


输入描述:

输入一个正整数n  (1 ≤ n ≤ 109)


输出描述:

输出一行,为正整数n表示为六进制的结果


示例1

输入:


6

输出:


10

示例2

输入:


120

输出:


320

参考代码为:


#include<stdio.h>
void six(int n)
{
  if (n != 0)
  {
  if (n >= 5)
    six(n / 6);
  printf("%d", n % 6);
  }
}
int main()
{
  int a;
  scanf("%d", &a);
  six(a);
  return 0;
}


代码的运行结果为:


92ba0822ed0b46e1ae72df8a17d3a45b.png


12,


序列中删除指定数字


描述


有一个整数序列(可能有重复的整数),现删除指定的某一个整数,输出删除指定数字之后的序列,序列中未被删除数字的前后位置没有发生改变。


数据范围:序列长度和序列中的值都满足 1 \le n \le 501≤n≤50


输入描述:

第一行输入一个整数(0≤N≤50)。


第二行输入N个整数,输入用空格分隔的N个整数。


第三行输入想要进行删除的一个整数。


输出描述:

输出为一行,删除指定数字之后的序列。


示例1

输入:


6

1 2 3 4 5 9

4

输出:


1 2 3 5 9

示例2

输入:


5

1 2 3 4 6

5

输出:


1 2 3 4 6

参考代码为:


#include<stdio.h>
int main()
{
    int n = 0;
    int x = 0;
    int arr[100] = { 0 };
    scanf_s("%d", &n);
    for (int i = 0; i < n; i++)
    {
        scanf_s("%d", &arr[i]);
    }
    scanf_s("%d", &x);
    for (int i = 0; i < n; i++)
    {
        if (arr[i] != x)
        {
            printf("%d ", arr[i]);
        }
    }
    return 0;
}


代码的运行结果为:


d79b274929334152a6d38be91e2d1be3.png


13.


小乐乐与欧几里得


描述


小乐乐最近在课上学习了如何求两个正整数的最大公约数与最小公倍数,但是他竟然不会求两个正整数的最大公约数与最小公倍数之和,请你帮助他解决这个问题。


输入描述:

每组输入包含两个正整数n和m。(1 ≤ n ≤ 109,1 ≤ m ≤ 109)


输出描述:

对于每组输入,输出一个正整数,为n和m的最大公约数与最小公倍数之和。


示例1

输入:


10 20

输出:


30

示例2

输入:


15 20

输出:


65

参考代码为:


#include<stdio.h>
int main(){
    long long a,b,comax,comin,k;
    scanf("%lld %lld",&a,&b);
    k=a*b;
    while(a&&b){
        if(a>b) a %=b;
        else b %= a;
    }
    comax=a>b?a:b;
    comin=k/comax;
    printf("%lld\n",comax+comin);
}

代码的运行结果为:


dfc80ca9d8004e6c9ddc00e8448ffc6a.png


另外一种写法为:


#include <stdio.h>
/*
int main()
{
    int n = 0;
    int m = 0;
    scanf("%d%d", &n, &m);
    //设max是最大公约数
    int max = n>m?m:n;
    //设min是最小公倍数
    int min = n>m?n:m;
    while(1)
    {
        if(m%max==0 && n%max ==0)
        {
            break;
        }
        max--;
    }
    while(1)
    {
        if(min%m == 0 && min%n==0)
        {
            break;
        }
        min++;
    }
    printf("%d\n", max+min);
    return 0;
}
*/
int main()
{
    long long n = 0;
    long long m = 0;
    long long k = 0;
    scanf("%lld %lld", &n, &m);
    long long a = n;
    long long b = m;
    while(k=a%b)
    {
        a = b;
        b = k;
    }
    printf("%lld\n", b+m*n/b);
    return 0;
}

14.


小乐乐走台阶



描述

小乐乐上课需要走n阶台阶,因为他腿比较长,所以每次可以选择走一阶或者走两阶,那么他一共有多少种走法?


输入描述:

输入包含一个整数n (1 ≤ n ≤ 30)


输出描述:

输出一个整数,即小乐乐可以走的方法数。


示例1

输入:


2

输出:


2

示例2

输入:


10

输出:


89

参考代码为:


#include <stdio.h>
int Fib(int n)
{
    if (n <= 2)
    {
        return n;
    }
    else
    {
        return Fib(n - 1) + Fib(n - 2);
    }
}
int main()
{
    int n = 0;
    scanf("%d", &n);
    int ret = Fib(n);
    printf("%d\n", ret);
    return 0;
}


代码的运行结果为:


0a2653c851af460fa595bd959398a8f1.png


此篇文章到此结束,有兴趣的老铁,请关注……感激


相关文章
|
3月前
|
存储 C语言 索引
【C语言篇】操作符详解(下篇)
如果某个操作数的类型在上⾯这个列表中排名靠后,那么⾸先要转换为另外⼀个操作数的类型后执⾏运算。
72 0
|
3月前
|
程序员 编译器 C语言
【C语言篇】操作符详解(上篇)
这是合法表达式,不会报错,但是通常达不到想要的结果, 即不是保证变量 j 的值在 i 和 k 之间。因为关系运算符是从左到右计算,所以实际执⾏的是下⾯的表达式。
247 0
|
20天前
|
存储 缓存 C语言
【c语言】简单的算术操作符、输入输出函数
本文介绍了C语言中的算术操作符、赋值操作符、单目操作符以及输入输出函数 `printf` 和 `scanf` 的基本用法。算术操作符包括加、减、乘、除和求余,其中除法和求余运算有特殊规则。赋值操作符用于给变量赋值,并支持复合赋值。单目操作符包括自增自减、正负号和强制类型转换。输入输出函数 `printf` 和 `scanf` 用于格式化输入和输出,支持多种占位符和格式控制。通过示例代码详细解释了这些操作符和函数的使用方法。
33 10
|
1月前
|
存储 编译器 C语言
【C语言】简单介绍进制和操作符
【C语言】简单介绍进制和操作符
157 1
|
1月前
|
存储 编译器 C语言
初识C语言5——操作符详解
初识C语言5——操作符详解
164 0
|
3月前
|
C语言
C语言操作符(补充+面试)
C语言操作符(补充+面试)
45 6
|
3月前
|
存储 编译器 C语言
十一:《初学C语言》— 操作符详解(上)
【8月更文挑战第12天】本篇文章讲解了二进制与非二进制的转换;原码反码和补码;移位操作符及位操作符,并附上多个教学代码及代码练习示例
56 0
十一:《初学C语言》—  操作符详解(上)
|
4月前
|
C语言
五:《初学C语言》— 操作符
本篇文章主要讲解了关系操作符和逻辑操作符并附上了多个代码示例
43 1
五:《初学C语言》—  操作符
|
5月前
|
C语言
C语言逻辑操作符的短路问题
C语言逻辑操作符的短路问题
|
5月前
|
编译器 C语言
【C语言】:中移位操作符,位操作符详运算规则详解
【C语言】:中移位操作符,位操作符详运算规则详解
41 1