Advertisement

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

阅读量:

实战训练1—报数游戏

问题描述:

小明和小鹏玩报数游戏,小明按1∼20 报数,小鹏按1∼30报数。若两人同时开始,并以同样的速度报数,当两人都报了1000个数时,同时报相同数的次数是多少呢?

输入格式

输出格式:

输出一行一个数字,即报相同数的次数。

输入输出样例:

输入样例 输出样例
340

问题分析:

根据题意,定义变量sum 用于记录同时报出相同数的次数,报数是从1到1000,使用for循环来模拟报数过程,循环变量num的值从1到1000,同时用变量i 和 j 分别用于跟踪小明和小鹏当前的报数值(在各自的周期内),i和j的起始值都为1,在每次循环中,判断如果 i 达到21(即小明的周期结束),则将其重置为1,开始新的周期;如果 j 达到31(即小鹏的周期结束),则将其重置为1,开始新的周期;并检查 i 和 j 是否相等,如果相等,说明两人同时报出了相同的数,此时将 sum 增加1;在循环结束之后,i 和 j 分别增加1,表明两个同时报下一个数。具体程序代码如下:

复制代码
 #include<bits/stdc++.h>

    
 using namespace std;
    
 int main(){
    
     int sum =0;//定义变量sum,记录报数相同的次数,并初始化为0 
    
     for(int i=1,j=1,num=1;num<=1000;i++,j++,num++){//循环变量num从1到1000,表示报数的总次数,循环变量i、j表示两人报数的值 
    
     if(i==21){//如果小明报数的值超出周期 
    
         i=1;//重新从1开始报数 
    
     }
    
     if(j==31){//如果小鹏报数的值超出周期 
    
         j=1;//重新从1开始报数 
    
     }
    
     if(i==j){//如果报数的值相同 
    
         sum++;//报数相同的次数sum增加1 
    
     }
    
     }
    
     cout<<sum<<endl;//输出次数 
    
     return 0;
    
 }
    
    
    
    

实战训练2—金币

问题描述:

国王将金币作为工资,发放给忠诚的骑士。第 1 天,骑士收到一枚金币;之后两天(第2天和第3天)里,每天收到两枚金币;之后三天(第4、5、6天)里,每天收到三枚金币;之后四天(第7、8、9、10 天)里,每天收到四枚金币……这种工资发放模式会一直这样延续下去:当连续n天每天收到n枚金币后,骑士会在之后的连续n+1天里,每天收到n+1枚金币(n为任意正整数)。需要编写一个程序,确定从第一天开始的给定天数内,骑士一共获得了多少金币。

输入格式:

输入一行一个整数n(1∼10000),表示天数。

输出格式:

输出一行一个整数,表示骑士获得的金币数。

输入输出样例:

输入样例1 输出样例1
8 22
输出样例1 输出样例2
20 85

问题分析:

根据题意,首先明确金币发放的模式:连续n天每天收到n枚金币,然后接下来的n+1天每天收到n+1枚金币,依此类推。输入一个整数n,表示要计算的天数,观察到每个阶段的天数和每天收到的金币数是相等的,并且随着阶段的增加,天数和金币数都在递增;可以通过迭代每个阶段,累加每个阶段发放的金币总数来计算总金币数。使用一个循环来迭代每个阶段,使用day表示金币累加的天数,直到天数day达到或超过给定的天数n,本题中使用while来实现;在每个阶段中,计算该阶段发放的金币总数,将每个阶段每天的金币数累加到总金币数中,本题中使用for循环来实现每个阶段,循环变量为i,对于每个阶段循环体中需要累加金币数量,同时还需要将天数day进行自增运算,对于每个阶段的天数用变量k来表表示,该阶段每天的金币数都是一样的,金币用jb来表示。具体程序代码如下:

复制代码
  
    
 #include<bits/stdc++.h>
    
 using namespace std;
    
 int main(){
    
     long long sum = 0;//定义金币总数变量sum,并初始化为0 
    
     int day=1,n,jb=1,k=1;//定义天数起始变量day并初始化为1,总天数变量n,每个阶段的天数变量k和金币数变量jb,起始值都为1 
    
     cin>>n;//输入n的值 
    
     while(day<=n){//当天数小于等于总天数n时 ,同一个阶段金币数一样 
    
     for(int i=1;i<=k && day<=n;i++){//对于同一个阶段循环变量i的起始值为1,终值小于该阶段的天数k,同时并且天数day的值要小于等于总天数n 
    
         sum+=jb;//将jb累加到sum中 
    
         day++;//计算天数自增 
    
     }
    
     jb++;//让金币值jb自增进入下一阶段 
    
     k++;//让天数k自增进入下一阶段 
    
     }
    
     cout<<sum<<endl;//输出金币数sum 
    
 }
    
    
    
    

实战训练3—百钱买白鸡

问题描述:

古代数学家张丘建在《算经》一书中提出数学问题:鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。百钱买百鸡,问鸡翁、鸡母、鸡雏各几何?要求公鸡、母鸡、雏鸡至少各一只。

输入格式:

输出格式:

输出能买的公鸡、母鸡以及鸡仔的数量,中间以空格隔开。

输入输出样例:

输入样例 输出样例
4 18 78 8 11 81 12 4 84

问题分析:

根据题意,花百钱来买百只鸡,鸡翁一只5钱(鸡翁最多20只),鸡母一只3钱(最多33只),剩余的为鸡雏3只1钱(鸡雏最多300只),要求列举出所有的方案数,本题使用for嵌套循环来实现,用外层循环变量i来控制鸡翁的只数,内层循环j来控制鸡母的只数,那么鸡雏的只数为(100-5i-j3)3,外层循环变量i,起始值为1,终值为20,循环变量更新表达式为自增运算,内层循环变量j,起始值为1,终值为33,循环变量更新表达式也为自增运算,内层循环的循环体,首先计算鸡雏的只数k为k=(100-5i-j*3)*3,然后计算鸡翁鸡母和鸡雏的和是否为100,并且鸡雏的取值位于1到300之间,如果两个条件表达式与的结果为真,那么输出该方案可行,输出这三种鸡的只数,如果两个条件表达式与的结果为假,那么该方案不可行,内循环是外循环的循环体。具体程序代码如下:

复制代码
  
    
 #include<bits/stdc++.h>
    
 using namespace std;
    
 int main(){
    
     for(int i=1;i<=20;i++){//循环变量i来表示鸡翁,从1到20 
    
     for(int j=1;j<=33;j++){//循环变量j来表示鸡母,从1到33 
    
         int k = (100-5*i-j*3)*3;//剩余的鸡雏的个数 
    
         if(k>=1 && k<=300 && (i+j+k ==100)){//鸡雏的个数取值范围为1到300,并且鸡翁鸡母和鸡雏的总个数等于100 
    
             cout<<i<<' '<<j<<' '<<k<<endl;//输出鸡翁 鸡母 和鸡雏的个数 
    
         }          
    
     }
    
     }
    
     return 0;
    
 }
    
    
    
    

全部评论 (0)

还没有任何评论哟~