变量, 运算符, 输入, 输出练习赛

发布于:2022-12-17 ⋅ 阅读:(434) ⋅ 点赞:(0)

A题 输出第3个整数

题目链接: Hcode OnlineJudge

#include <stdio.h>
int main()
{
	int a,b,c,d,e,f;
    scanf("%d %d %d %d %d %d",&a,&b,&c,&d,&e,&f);
    printf("%d",c);
	return 0;
}

B题 基本数据类型的储存空间

题目链接: Hcode OnlineJudge

这题卡了不少人啊, 由于出题组和讲题组的配合不好, 没有讲如何获取数据类型的储存空间, 也没有讲bool类型导致很多人卡住了

其实获取变量类型的存储范围就是用sizeof函数

sizeof(a);//a为某类型变量

而bool类型是C++中只有true(值为1)和false(值为0)的数据类型, 一般在判断中使用

#include <iostream>
using namespace std;
int main()
{
    long long a,b,c,d,e,f,g;
        
    a=sizeof(int);
    b=sizeof(short);
    c=sizeof(long long);
    d=sizeof(float);
    e=sizeof(double);
    f=sizeof(bool);
    g=sizeof(char);
    printf("%lld %lld %lld %lld %lld %lld %lld",a,b,c,d,e,f,g);
   
    return 0;
}

C题 长门有希的忧郁

题目链接 Hcode OnlineJudge

这题的题目要求非常简单明了, 我相信没有学弟看不懂的, 问题就在于 数据范围, 题目中有提示

对于全部的测试点, 保证 10000000000000000 > a * b > 0

而int的最大值是2147483647, 根本装不下, 导致数据溢出wa掉

正确的方式是将变量都定义为long long, 并用%lld进行输入和输出

#include <stdio.h>
int main()
{
	long long a,b;
    scanf("%lld %lld",&a,&b);
    
    printf("%lld %lld %lld %lld %lld",a+b,a-b,a*b,a/b,a%b);
	
	return 0;
}

D题 浮点数保留小数位后?位

题目链接 Hcode OnlineJudge

考输出格式, %f输出单精度 %lf输出双精度, %后加.x表示保留后x位小数点

#include <stdio.h>
int main()
{
	float a;
    double b;
    scanf("%f %lf",&a,&b);
    
    printf("%.3f\n%.12lf",a,b);
	
	return 0;
}

E题 输出浮点数

题目链接 Hcode OnlineJudge

同输出要求, 记得换行输出 \n 表示换行符

#include <stdio.h>
int main()
{
	double a;
    scanf("%lf",&a);
    
    printf("%f\n%.5f\n%e\n%g\n",a,a,a,a);
	
	return 0;
}

F题 对齐输出

题目链接 Hcode OnlineJudge

这题的要求上课讲过了, 有的同学在后面没听见, 我的建议是: 如果对自己的实力有把握就坐后面, 早点来做前面听学长细讲会好很多

对齐输出的输出格式就是%xd, 表示对齐8位输出int类型的变量

#include <stdio.h>
int main()
{
	int a,b,c;
    scanf("%d %d %d",&a,&b,&c);
    
    printf("%8d %8d %8d",a,b,c);
	
	return 0;
}

G题 类型转换

题目链接 Hcode OnlineJudge

关于此题, 先给学弟们道个歉, 因为出题人不仔细的原因...答案顺序反了...

这是个选择题, 我们先看题面

a = 32768;
b = a;
printf("%d %d\n", a, b);

输出的结果是32768和-32768

没有给出a和b的数据类型, 让你从A. bool B. char C. short D. int E. float F. double中选择a和b的数据类型

我们先用排除法, 上面说过, A bool值只有0和1, 因此不可能是bool, 排除A

B char, char的取值范围是-128~127, 也是不可能输出32768和-32768的

C和D我们之后再说

E和F都是浮点类型, 如果用%d输出会导致出问题, 输出一些意想不到的值, 排除EF

那么只剩下了C和D, 关键是a是C还是b是C, int给a和b都是可以的

我们来看看short的范围 -32768~32767 讲到这里可能有的同学已经猜到b是short类型了, 但你知道为什么吗?

细纠程序 b被a赋值为32768, 但因为数据范围最大为32767, 无法成功赋值, 多出的1由于计算机的补码机制, 使最大值变成了最小值 -32768

关于补码机制, 计算机导论课会提, 想要了解的同学可以百度和认真听计导课

这道题非常值得深究, 可以深刻理解变量范围, 建议深入了解

所以正解是DC

#include <stdio.h>
int main()
{
	printf("D C");
	return 0;
}

H题 甲流疫情死亡率

题目链接: Hcode OnlineJudge

这题在于%的输出方式和保留小数的输出方式

%的输出方式已给出, %.xlf为输出double类型变量的后x位

#include<stdio.h>
int main()
{
	double a,b;
	scanf("%lf%lf",&a,&b);
	double c;
	c=b/a*100;
	printf("%.3lf%%",c);
	return 0;
}

I题 计算并联电阻的阻值

题目链接 Hcode OnlineJudge

#include <stdio.h>
int main()
{
	double a,c;
    scanf("%lf %lf",&a,&c);
    
    printf("%.2lf",1/(1/a + 1/c));
	
	return 0;
}

H题 《关于计科acm再次铺地板砖这件事》

题目链接 Hcode OnlineJudge

在写这题之前, 我们要知道计算机的除法机制, 如果是两个整型变量相除, 小数点后的数字就会被无条件省略, 表示为向下取整, 例如3/2=1

这题蛮好想, 地砖是2*1, 地板是n*m, 尽量把地板铺满, 地砖不能切块, 也不能超过地板的界限. 那么我们直接\frac{n*m}{2}用地板的面积/地砖的面积, 多出的小数点(比如0.9个地砖)因为地砖无法分割, 不能装在地板上, 因此舍去, 咱们之前提到的整型变量除法机制会自动向下取整, 所以不需要额外处理, 直接输出\frac{n*m}{2}

#include <stdio.h>
int main()
{
	int m,n;
    scanf("%d %d",&m,&n);
    long long c = m*n;

    printf("%d",c/2);
	return 0;
}


网站公告

今日签到

点亮在社区的每一天
去签到