文章目录
前言
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.只要有了优先级和结合性,表达式就能求出唯一值
有了优先级和结合性,表达式也有可能有不同的计算机路径,导致计算结果的差异。