【算法竞赛】C++入门(三)、C++输入输出初级 -- 习题篇

🔭 个人主页: 散峰而望

《C语言:从基础到进阶》《编程工具的下载和使用》《C语言刷题》《算法竞赛从入门到获奖》《人工智能AI学习》《AI Agent》
愿为出海月,不做归山云


🎬博主简介

【算法竞赛】C++入门(三)、C++输入输出 -- 习题篇


鸡兔共笼

鸡兔共笼

由题目要求算出鸡兔各有多少只,该题有多种解法,这里我例举两种方法:

题解:

  1. 设鸡有 j 只,兔有 t 只,头记为 h,脚记为 f
  2. 法一:用方程 j + t == hj * 2 + t * 4 == f
    法二:假设都是 4 只脚 (j + t) * 4 = 140,则多出来的脚数再除以 2 便得到鸡的数量
cpp 复制代码
//法一
#include <iostream>
using namespace std;

int main()
{
	int j = 0;//鸡
	int t = 0;//兔
	int h = 35;//头
	int f = 94;//脚
	t = (f - h * 2) / 2;
	j = h - t;
	cout << t << " " << j << endl;
	return 0;
}
cpp 复制代码
//法二
#include <iostream>
using namespace std;

int main()
{
	int j = 0;//鸡
	int t = 0;//兔
	int h = 35;//头
	int f = 94;//脚
	j = (4 * h - f) / 2;
	t = h - j;
	cout << t << " " << j << endl;
	return 0;
}

计算 (a+b)×c 的值

计算 (a+b)×c 的值

题目简单按照题目要求即可

cpp 复制代码
#include <iostream>
using namespace std;
int a, b, c;
int main()
{
    cin >> a >> b >> c;
    int r = (a + b) * c;
    cout << r << endl;
    return 0;
}

提示:

这个题目一定能注意,数据范围,-10^4 < a,b,c < 10^4,(a+b)*c 的结果也不会超过有符号整型的最大值,而如果取值范围变成 -10^5 < a,b,c < 10^5,就需要使用 long long 类型了。

做题的时候一定要多留意数据范围。

带余除法

带余除法

题目要求不仅得到整商,还要得到余数,即用 / 得到商,用 % 得到余数

cpp 复制代码
#include <iostream>
using namespace std;
int a, b;
    
int main() 
{
    cin >> a >> b;
    cout << a / b << " " << a % b << endl;
}

整数的个位

整数的个位

非常简单的题直接上代码

cpp 复制代码
#include <iostream>
using namespace std;
int a;
int main() 
{
    cin >> a;
    cout << a % 10 << endl;
    return 0;
}

整数的十位

整数的十位

如果想要得到十位那么就要余上 100 得到十位和个位上面的数之后再把个位数除去即可。

题解:

  1. 假设输入的为 a
  2. 之后 a % 100 / 10即可
cpp 复制代码
#include <iostream>
using namespace std;
int a;
int main()
{
    cin >> a;
    cout << a % 100 / 10 << endl;
    return 0;
}

时间转换

时间转换

题解:

由题目的示例 1,我们可以推测出秒是余数,而分钟需要除以 60 并余下 60 得到,小时除两次 60。

即:

  1. time除以60(1分钟有60秒)先换算出分钟数,分钟数除以60(1小时有60分钟)交换算成小时。
  2. time除以60(1分钟有60秒)先换算出分钟数,分钟数对60取模,就是换完小时后剩余的分钟数
  3. time对60取模,每60秒凑1分钟,还剩多少多少秒,没办法凑够一分钟。
cpp 复制代码
#include <iostream>
using namespace std;
    
int main() 
{
    int time;
    cin >> time;
    cout << time / 60 / 60 << " " << time / 60 % 60 << " " << time % 60 << endl; 
    return 0;
}

小鱼的游泳时间

小鱼的游泳时间

由题目可知,题目让我们求小鱼的游泳时间,即我们算出两个时间段的差值,然后按照小时分钟输出即可

题解:

  1. 输入两个时间点的时分
  2. 之后将小时换算成分钟计算两个时间点之间的时间段
  3. 接着将算出的时间重新换算成时分
cpp 复制代码
#include <iostream>
using namespace std;

int main()
{
	int a, b, c, d;
	cin >> a >> b >> c >> d;
	int t = c * 60 + d - a * 60 - b;
	int h, m;
	h = t / 60;
	m = t % 60;
	cout << h << " " << m << endl;
	return 0;
}

账户余额

小明账户有 100 元,经过了下面的操作:

  • 往里面存了 10 元
  • 购物花掉了 20 元
  • 把里面的钱全部取出
    请在每次操作后输出账户余额:
cpp 复制代码
#include <iostream>
using namespace std;
int main() 
{  
    int balance = 100;
    
    balance += 10;
    cout << balance << endl;
    
    balance -= 20;
    cout << balance << endl;
    
    balance = 0;
    cout << balance << endl;
    
    return 0;  
}

提示:

使用复合赋值操作符能够让代码更简洁,但需要注意,不要一味地追求代码简洁,过于简洁的代码在可读性上会差一些。

交换值

交换值

题解:

非常简单的题目只需要设一个中间的变量,然后利用中间值交换一下就行。不过还有一种写法就是使用 ^ 来处理不能使用中间变量交换的情况,到后面位运算和操作符会进行详细的讲解

cpp 复制代码
#include <iostream>
using namespace std;

int main()
{
     int a = 0;
     int b = 0;
     cin >> a >> b;
     
     int c = a; //c是一个临时变量,作为中间变量实现交换的 
     a = b;
     b = c;
     cout << a << " " << b << endl;
     
     return 0;
}

成绩

成绩

题解:

按照题目要求让 a,b,c 每一科乘以对应的百分比

同时还要注意题目要求总成绩一定是整数,需要乘以完各对应成绩的百分比后强转为整型

cpp 复制代码
#include <iostream>
using namespace std;
int a,b,c;
int ret;
int main()
{
    cin >> a >> b >> c;
    ret = (int)(a * 0.2 + b * 0.3 + c * 0.5);//这里进行了强制类型转换
    //也可以写成这样 int ret = (a * 0.2 + b * 0.3 + c * 0.5);
    cout << ret << endl;
    return 0;
}

浮点数向零舍入

浮点数向零舍入

非常简单题目,只需要注意一下图片中红框的内容。

cpp 复制代码
#include <iostream>
using namespace std;
double x;
int main()
{
    cin >> x;
    cout << (long long)x << endl;//题目给的数据较大,强制转换为int,存在漏洞    
    return 0;
}

打印 ASCII 码

打印 ASCII 码

也是一道简单题只需要输出强转一下整型即可。

cpp 复制代码
#include <iostream>
using namespace std;
int main()
{
    char c = 0;
    cin >> c;
    cout << (int)c <<endl; //如果没有强制类型转换,编译器会认为c是字符类型,打印的依然是字符 
    return 0;
}

打印字符

打印字符

和上面的那道题一样输出时需要强转类型。

cpp 复制代码
#include <iostream>
using namespace std;
int main()
{
    int n = 0;
    cin >> n;
    cout << (char)n <<endl; //利用强制类型转换,将ASCII码值按照字符类型打印 
    return 0;
}

浮点除法

浮点除法

题解:

根据题目要求输入两个整数然后相除得到一个小数,并且只有小于等于 10^3 时才被接受。

即我们需要保证最后输出的小数保留有 3 位小数

cpp 复制代码
#include <iostream>
#include <cstdio>
using namespace std;

int main()
{
    int a, b;
    cin >> a >> b;
    printf("%.3lf\n", a * 1.0 / b);
    return 0;
}

甲流疫情死亡率

甲流疫情死亡率

和上面一道题类似,只需要注意一下以下一些情况:

  1. 百分号 % 可以这样输出:printf("%%");
  2. 注意a和b的取值范围
  3. 百分比不是直接b/a,是需要乘以100.0的,因为需要得到小数,所以要是小数除法
  4. 有时候:先乘 100 再除 a,还是先除 a 再乘 100 是有差异的。
    比如:4/8 * 100 和 4 * 100/8 的结果就有差异的。
cpp 复制代码
#include<cstdio>
int main()
{
    int a, b;
    scanf("%d%d", &a, &b);
    printf("%.3lf%%\n", b * 100.0 / a);
    return 0;
}

温度表达转化

温度表达转化

按照题目要求输入输出就行。

cpp 复制代码
#include <cstdio>
int main()
{
    double f = 0;
    scanf("%lf", &f);
    double c = 5 * (f - 32) / 9.0;
    printf("%.5lf\n", c);
    return 0;
}

计算并联电阻的阻值

计算并联电阻的阻值

按照题目要求输入输出就行。

cpp 复制代码
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
    double r1 = 0, r2 = 0;
    cin >> r1 >> r2;
    double ret = 1.0 / (1.0 / r1 + 1.0 / r2);
    printf("%.2lf\n", ret);
    return 0;
}

与圆相关的计算

与圆相关的计算

按照题目要求输入输出就行。

cpp 复制代码
#include <iostream>
#include <cstdio>
using namespace std;
const double PI = 3.14159;
double r, z, len, area;
int main()
{
    cin >> r;
    z = 2 * r;
    len = 2 * PI * r;
    area = PI * r * r;
    printf("%.4lf %.4lf %.4lf\n", z, len, area);
    
    return 0;
}

对齐输出

对齐输出

按照题目要求输入输出就行。

cpp 复制代码
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
    int a, b, c;
    cin >> a >> b >> c;
    printf("%8d %8d %8d\n", a, b, c);
    return 0;
}

糖果游戏

糖果游戏

题解:

这道题稍微复杂一些,这里举个例子。假如 1 小朋友有 7 个糖果,需要分成 3 份,分别给旁边的 2 和 5 小朋友,即最后 1 小朋友留下 2 个糖果,2 和 5 各得 2 糖果,多的糖果被 1 小朋友吃掉。之后 2,3,4,5 小朋友重复以上操作。

然后最好画一个图分清每个小朋友给糖情况。

cpp 复制代码
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
    int a, b, c, d, e;
    cin >> a >> b >> c >> d >> e;
    a /= 3;  e += a;   b += a;
    b /= 3;  a += b;   c += b;
    c /= 3;  b += c;   d += c;
    d /= 3;  c += d;   e += d;
    e /= 3;  d += e;   a += e;
    printf("%5d%5d%5d%5d%5d\n",a ,b, c, d, e);
    return 0;
}

数字反转

数字反转

按照题目要求输入输出即可。

cpp 复制代码
//代码1 
#include <iostream>
using namespace std;
int main()
{
    char a, b, c, d, e;
    cin >> a >> b >> c >> d >> e;
    cout << e << d << c << b << a << endl;
    return 0;
}
//代码2 
#include <cstdio>
int main()
{
    char a, b, c, d;
    scanf("%c%c%c.%c", &a, &b, &c, &d);
    printf("%c.%c%c%c\n", d, c, b, a);
    return 0;
}

三角形面积

三角形面积

cpp 复制代码
//代码1 
#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std;
int main()
{
    double a, b, c;
    cin >> a >> b >> c;
    double p = (a + b + c) / 2;
    double area = sqrt(p * (p - a) * (p - b) * (p - c));
    cout << fixed << setprecision(1) << area << endl;
    return 0;
}
//代码2 
#include <iostream>
#include <cmath>
#include <cstdio>
using namespace std;
int main()
{
    double a, b, c;
    cin >> a >> b >> c;
    double p = (a + b + c) / 2;
    double area = sqrt(p * (p - a) * (p - b) * (p - c));
    printf("%.1f\n", area);
    return 0;
}    

这里给大家介绍一个库函数 sqrt,这个函数是计算平方根的,函数原型如下:

cpp 复制代码
double sqrt (double x);
float sqrt (float x);
long double sqrt (long double x);

函数可以计算出参数 x 的平方根,然后返回,这个函数需要的头文件是 < cmath >


结语

这些可以熟悉C++的基本输入输出操作,包括 cincout 的使用、数据类型的匹配以及简单的格式化输出。

掌握这些基础技能是算法竞赛的起点,后续的题目会涉及更复杂的数据处理和逻辑控制。建议反复练习,确保能快速准确地处理输入输出,为更高阶的算法学习打下坚实基础。

多尝试不同的输入输出方式,如读取多组数据、处理字符串或特殊格式要求,逐步提升代码的效率。

愿诸君能一起共渡重重浪,终见缛彩遥分地,繁光远缀天

相关推荐
kylezhao20193 小时前
第三节、C# 上位机面向对象编程详解(工控硬件封装实战版)
开发语言·前端·c#
kingwebo'sZone3 小时前
c# 遍历 根据控件名获取控件实例
开发语言·c#
jianfeng_zhu3 小时前
二叉排序树的建立和插入
算法
不会c嘎嘎3 小时前
数据结构 -- 常见的八大排序算法
数据结构·c++·算法·排序算法·面试题·快速排序
星空椰3 小时前
jvms Java 版本管理工具
java·开发语言
REDcker3 小时前
C++ 崩溃堆栈捕获库详解
linux·开发语言·c++·tcp/ip·架构·崩溃·堆栈
WW_千谷山4_sch3 小时前
洛谷P8653:[模板] [蓝桥杯 2017 国 C] 分考场(染色最小色数)
c++·算法·蓝桥杯·深度优先
兵哥工控3 小时前
MFC高精度方波发生器实现
c++·mfc
qq_406176143 小时前
JavaScript闭包:从底层原理到实战
开发语言·前端·javascript