test_5_11


前言

5_11刷题

一、题目及解答

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

输入描述 :

两个整数

输出描述:

二进制不同位的个数

# define _CRT_SECURE_NO_WARNINGS
# include<stdio.h>
int main() {
	int count = 0;
	int a = 0, b = 0;
	int i = 0;
	scanf("%d %d", &a, &b);
	for (i = 1; i <= 32; i++) {
		if ((a & 1) != (b & 1)) {
			count++;
		}
		a = a >> 1;
		b = b >> 1;
	}
	printf("%d\n", count);
	return 0;
}

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

作业内容

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

# define _CRT_SECURE_NO_WARNINGS
# include<stdio.h>
int main() {
	int a = 0;
	int i = 0;
	scanf("%d", &a);
	printf("二进制:");
	for (i = 31; i >= 0; i--) {
		printf("%d ", (a >> i) & 1);
	}
	printf("\n");
	printf("偶数位:");
	for (i = 31; i >= 0; i -= 2) {
		printf("%d ", (a >> i) & 1);
	}
	printf("\n");
	printf("奇数位:");
	for (i = 30; i >= 0; i -= 2) {
		printf("%d ", (a >> i) & 1);
	}
	printf("\n");
	return 0;
}

在这里插入图片描述

3. 统计二进制中1的个数

作业内容

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

比如: 15 0000 1111 4 个 1
在这里插入图片描述这里不是以函数形式给出的

# define _CRT_SECURE_NO_WARNINGS
# include<stdio.h>
int main() {
	int a = 0;
	int i = 0;
	int count = 0;
	scanf("%d", &a);
	for (i = 0; i < 32; i++) {
		if ((a >> i & 1) == 1)
			count++;
	}
	printf("%d\n", count);
	 return 0;
}

另外如果要想知道一个数是不是2的n次方,只需要判断n&(n-1)是否等于0即可

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

作业内容

不允许创建临时变量,交换两个整数的内容
在这里插入图片描述

# define _CRT_SECURE_NO_WARNINGS
# include<stdio.h>
int main() {
	int a = 1;
	int b = 3;
	printf("交换前:%d %d", a, b);
	a = a ^ b;
	b = a ^ b;
	a = a ^ b;
	printf("\n交换后:%d %d\n", a, b);
	return 0;
}

5. 下面代码的结果是:

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

答案是>
原因是:
第一 全局变量没有给初始化值时, 编译器会默认赋值为0
第二 sizeof操作符的返回类型是unsigned,无符号类型
第三 无符号类型和有符号类型进行比较时,会将有符号类型转换为无符号类型,-1转换为无符号类型后是一个很大的正数,远大于4.
这道题其实很隐蔽,真是虾仁猪心!!!

6. X形图案

KiKi学习了循环,BoBo老师给他出了一系列打印图案的练习,该任务是打印用“*”组成的X形图案。

输入描述:
多组输入,一个整数(2~20),表示输出的行数,也表示组成“X”的反斜线和正斜线的长度

输出描述:

针对每行输入,输出用“*”组成的X形图案。
在这里插入图片描述

# include<stdio.h>
int main(){
    int a = 0;
    int i = 0;
    int j = 0;
    while (scanf ("%d", &a) != EOF){
        for (i = 0; i < a; i++){
            for (j = 0; j < a; j++){
                if (i == j || i == a - 1-j)
                    printf("*");
                else
                    printf(" ");
            }
            printf("\n");
        }
    }
    return 0;
}

7. 获得月份天数

KiKi想获得某年某月有多少天,请帮他编程实现。输入年份和月份,计算这一年这个月有多少天。
输入描述:
多组输入,一行有两个整数,分别表示年份和月份,用空格分隔。
输出描述:
针对每组输入,输出为一行,一个整数,表示这一年这个月有多少天。
在这里插入图片描述

# include<stdio.h>
int main() {
    int year = 0;
    int month = 0;
    while (scanf("%d %d", &year, &month) != EOF) {
        if (month == 2) {
            if (year % 4 == 0 || (year % 100 != 0 && year % 400 == 0))
                printf("29\n");
            else
                printf("28\n");
        }
        else {
            if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12)
                printf("31\n");
            else
                printf("30\n");
        }
    }

    return 0;
}

8. 三角形判断

KiKi想知道已经给出的三条边a,b,c能否构成三角形,如果能构成三角形,判断三角形的类型(等边三角形、等腰三角形或普通三角形)。
输入描述:
题目有多组输入数据,每一行输入三个a,b,c(0<a,b,c<1000),作为三角形的三个边,用空格分隔。
输出描述:
针对每组输入数据,输出占一行,如果能构成三角形,等边三角形则输出“Equilateral triangle!”,等腰三角形则输出“Isosceles triangle!”,其余的三角形则输出“Ordinary triangle!”,反之输出“Not a triangle!”。
在这里插入图片描述

# include<stdio.h>
int main() {
    int a = 0, b = 0, c = 0;
    while (scanf("%d %d %d", &a, &b, &c) != EOF) {
        if (a + b > c && a - b < c) {
            if (a == b && b == c)
                printf("Equilateral triangle!\n");
            else if (a == b || b == c || a == c)
                printf("Isosceles triangle!\n");
            else
                printf("Ordinary triangle!\n");
        }
        else
            printf("Not a triangle!\n");
    }
    return 0;
}

9. 下面代码的结果是:

#include <stdio.h>
int main()
{
int i = 1;
int ret = (++i)+(++i)+(++i);
printf(“ret = %d\n”, ret);
return 0;
}
表达式(++i)+(++i)+(++i),只有操作符的优先级和结合性,没法确定唯一计算路径

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

可以在VS和Linux gcc测试,结果可能有差异。
所以这道题程序错误

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

A.表达式求值先看是否存在整形提升或算术转换,再进行计算
B.表达式真正计算的时候先看相邻操作符的优先级决定先算谁
C.相邻操作符的优先级相同的情况下,看操作符的结合性决定计算顺序
D.只要有了优先级和结合性,表达式就能求出唯一值

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

With Order @!147

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值