首页 > 其他分享 >全国青少年信息学奥林匹克竞赛(信奥赛)备考实战之循环结构(while循环应用)

全国青少年信息学奥林匹克竞赛(信奥赛)备考实战之循环结构(while循环应用)

时间:2025-01-09 23:29:09浏览次数:3  
标签:10 信奥赛 样例 while 循环 馆内 rn 人数 输入

到目前为止,所有的训练题目中给出的输入数据个数是确定的,但是有时候输入数据个数不确定,这种情况下,需要不断读取数据直到没有新的输入数据为止,那么C++是如何判断出读到文件末尾(或者没有新的输入)了呢?在C++中使用"EOF"(end of file)来实现,代表文件(file)或者标准输入(stdin)的结尾,读入语句一旦判断到文件末尾,即可结束读入数据。

实战训练1—统计馆内人数

问题描述:

某市新开了一家科技馆,放假期间每天有许多团队慕名而来入场参观,每个团队人数介于2到50之间,并且必须团进团出,游客不得脱团行动。请编写一个程序,计算馆内的实时人数。

输入格式:

输入一行若干个整数,代表若干个团队的人数。入场团队人数为正数,离场团队人数为负数。团 队总数不超过10000。

输出格式:

输出一行一个整数,代表馆内的游客人数。数据保证馆内游客人数不会小于 0。

输入输出样例:

输入样例1

输出样例1

3  4  5  10  -4  -10  5  8  -3

18

输入样例2

输出样例2

3  4  5  8  -4  -8 -5  10 -3

10

问题分析:

根据题意,需要一个变量sum来存储科技馆内的总人数,根据输入的进入团队或离场人数来实时更新馆内的总人数,由于不确定输入的数据个数,所以只要判断输入的不是结束标志EOF,那么就进行操作,使用while循环来是实现,具体程序代码如下:

#include<bits/stdc++.h>

using namespace std;

int main(){

    int sum=0,tmp;//定义馆内总人数变量sum(并初始化为0)和每次进入馆内或离开馆内人数 

    while(scanf("%d",&tmp)!=EOF){//只要有数据输入表明馆内人数在变化 

        sum += tmp;//将人数变化累加到和变量sum中 

    }

    printf("%d\n",sum); //输出馆内人数 

    return 0;

}

这段程序看起来似乎没有任何问题,但是在dev中输入测试样例运行时,输入回车后没有任何反应,也就是说scanf并没有读到EOF,程序仍然在等待输入,在Windows系统中,输入回车之后,再接着按"Ctrl+Z"程序才能输出正确的结果,如果是Linux系统,需要键入"Ctrl+D"。同理cin在遇到EOF也表明读入数据结束,具体程序代码如下:

#include<bits/stdc++.h>

using namespace std;

int main(){

    int sum=0,tmp;//定义馆内总人数变量sum(并初始化为0)和每次进入馆内或离开馆内人数?

    while(cin>>tmp){//只要有数据输入表明馆内人数在变化

        sum += tmp;//将人数变化累加到和变量sum中

    }

    cout<<sum<<endl;//输出馆内人数

    return 0;

}

实战训练2—数字反转

问题描述:

给定一个整数,请将该数各个位上数字反转得到一个新数。新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零,例如输入420,反转后得到的新数为24。

输入格式:

输入一行一个整数,该整数定义为n(-10000000000<=n<=10000000000)。

输出格式:

输出一行一个整数,表示反转后的整数。

输入输出样例:

输入样例1

输出样例1

985

589

输入样例2

输出样例2

1120

211

问题分析:

根据题意,假设输入变量为n,要构建反转后的数字rn,可以借鉴数位分离的思想,使用循环来逐位提取输入整数的每一位数字,通过取模运算 % 10 得到当前最低位的数字,将反转后的数字rn乘以10加上最低位为rn重新赋值,这样就可以得到到目前为止所有最低位数得到的反转数字rn,例如123,起始值rn为0,分离最低位数3之后,得到反转后数为3,再通过整除运算 /= 10 去掉当前最低位的数字,为下一次迭代准备,例如123变为12,紧接着在分离出2,rn=3*10+2=32,依次进行下去;其次需要注意n的取值范围,由于n最大值超出了int表示的范围,所以采用long long类型,具体程序代码如下:

#include<bits/stdc++.h>

using namespace std;

int main() {

    long long n,rn=0;//定义变量n和反转后的变量rn并初始化为0

    cin>>n;//输入n的值 

   	while(n){//从低位开始到高位依次分离数字 

        rn = rn*10 +n%10;//将rn的值赋值为rn*10+最低位数 

        n /= 10;//修改n的值 

    }

  	cout<<rn<<endl;//输出反转后的整数 

    return 0;

}

实战训练3—简单的除法

问题描述:

输入三个正整数a,b,n(a,b≤10,1≤n≤200),输出a÷b的值,要求计算结果精确到小数点后n位,最后一位不需要四舍五入。

输入格式:

输入一行三个整数a、b和n,中间用逗号隔开。

输出格式:

输出一行一个数,即a÷b 的小数点后面有n位的值。

输入输出样例:

输入样例1

输出样例1

1 3 5

0.33333

输入样例2

输出样例2

10 7 12

1.428571428571

问题分析:

这道题给人的第一反应就是用double类型数据进行除法运算,但是题目中要求结果精确到小数点后n位(1≤n≤200),double类型数据的精度无法达到,因此只能另辟蹊径。可以通过除法竖式得到启发,a÷b的商的小数部分就是在重复“余数x10÷b的商”。例如10÷7,10除以7商为1,余数是3,接着用余数3乘10得到30,继续除以7得商为4,即小数部分当前位的值,30除以7的余数2继续乘10,以此类推,直到求解得到n位小数,具体程序代码为:

#include<bits/stdc++.h>

using namespace std;

int main(){

    int a,b,n,t=1;//首先定义变量a、b和小数点后n位变量,以及while循环变量来标志小数位数并初始化为1 

    cin>>a>>b>>n;//输入a、b和n 

    cout<<a/b<<'.';//输出小数点前面内容 

    a=a%b*10;//求余乘以10 

    while(t<=n){//小数位数小于等于n则进入循环 

        cout<<a/b;//依次输出小数内容 

        a=a%b*10;//求余乘以10修改a 

        t++;//小数标志自增运算 

    }

    return 0;

}

标签:10,信奥赛,样例,while,循环,馆内,rn,人数,输入
From: https://blog.csdn.net/ALISHENGYA/article/details/145044413

相关文章

  • JAVA-Day 09:While循环语句
    While循环while循环格式初始化语句;while(条件判断语句){循环体语句;条件控制语句;}初始化语句只执行一次判断语句为True,循环继续判断语句为False,循环结束例:世界最高山峰珠穆朗玛峰的高度为8844.43米=8844430毫米,假如有一张足够大的纸,它的厚度为0.1毫米。请问,折叠多......
  • JAVA-Day 08:For循环语句
    For循环For循环格式for循环语句格式for(初始化语句;条件判断语句;条件控制语句){循环语句体;}执行流程:1、执行初始化语句2、执行条件判断语句,看其结果是True还是False,如果是True,执行循语句体,如果是False,循环结束3、执行条件控制语句4、回到2继续执行条件判断语句例:玩......
  • 《python基于循环神经网络的情感分类系统》毕业设计项目
    大家好我是君君学姐,混迹在java圈的辛苦码农。今天要和大家聊的是一款《python基于循环神经网络的情感分类系统》毕业设计项目。项目源码以及部署相关请联系君君学姐,文末附上联系信息。......
  • 【Javascript Day4】三元运算符及循环(while、do while)
    目录三元运算符循环while循环do{ }while()循环案例三元运算符//0:女 1:男     varsex=1;    //编号的转换变量,基于编号的值提供显示文本    vartemp="";    if(sex===0){      temp="女";   ......
  • 17C++循环结构-(do-while循环)2——教学
    一、实例1、模拟法1在一次风之巅小学文艺汇演中,狐狸老师、尼克、格莱尔同台演出,其中个环节是拍手游戏,狐狸老师每1秒拍一次手,尼克每2秒拍次,格莱尔每4秒拍一次。三人同时开始拍第一次手,每人都拍10次。试编一程序,算一算观众可听到多少声拿声?按时间顺序,根据每个人的条件模拟拍手......
  • 16C++循环结构-(do-while循环)1——教学
    一、do-while语句问题:每次测试后狐狸老师总会把成绩输入计算机,进行处理分析。但输入时有时会出错,如当满分为100分时,输入小于0或大于100的数,表示输入有误。试编一程序,输入某一位同学成绩时,自动检查输入数据的正确性,当输入有误时重新输入。我们用do-while语句来编写这个程序......
  • 15C++循环结构-while循环(2)
    一、while语句的应用问题:对于每一个正整数,如果它是奇数,则对它乘3再加1,如果它是偶数,则对它除以2,如此循环,最终都能够得到1,这就是由日本数学家角谷静夫发现的角谷猜想,又称为3n+1猜想。如取一个数字6,根据上述公式,得出6→3→10→5→16→8→4→2→1。试编一程序,验证角谷猜想。流程图:......
  • 【ROS2】Qt事件循环和ROS2订阅机制一起使用有什么注意事项?
    1、简述Qt的事件循环和ROS订阅回调函数都可能在阻塞函数中运行,例如:Qt的QApplication::exec()和ROS的rclcpp::spin()两个阻塞函数不能在同一个线程中使用,如果使用不当,会造成Qt不处理事件或者ROS2不处理订阅的回调函数。2、多线程一般QApplication::exec()运行在主线......
  • Windows bat批处理用for遍历、循环、查找的变量不能在for外用
    前言全局说明Windowsbat批处理用for遍历、循环、查找的变量不能在for外用Windowsbat不像Linuxshell有很完善的语法,bat中除了判断,很多查询或要遍历的东西都要用for完成。一、说明1.1环境:Windows二、for循环变量下面的写法,for循环外是获取不到file,因......
  • rust学习十五.5、引用循环和内存泄露
    这个章节主要是为了引出弱引用这个奇怪的概念。说实在,这个没有什么太好写的,因为内容比较晦涩难懂! 在其它语言中,也常常存在所谓循环引用问题,和大部分问题一样,在其它语言中这些基本上都不是问题。但是在rust中,这是一个致命的问题。 例如有a,b两个点,a指向b,b指向a。如果根据截......