11.24 作业 Problem F: 老师的点名方案

Description

在大学课堂上有很多课程听课班级和学生都很多,全体点名要花很长时间。因此,老师经常采用部分点名的方法。为了方便,老师做了一个程序可以产生多个随机数x,每个随机数x表示一个学生的序号,这个序号用来点名或者提问某个同学。

现在你做一个程序帮助老师完成这个功能:把一个随机数x转换成一个学生的序号。转换的方案如下:

假设听课的有m个班,一班N1个学生,二班有N2个学生……m班有Nm个学生。那么一班的学生序号为:1~N1;二班的学生序号为1~N2;……m班的学生序号为1~Nm,学生总数sumN=N1+N2+...+Nm。

对于一个随机数x,当x<=sumN时,

x=1是一班1号,x=2是一班2号,……x=N1是一班的N1号(一班的最后一个序号);

x=N1+1是二班1号,x=N1+2是二班2号,……x=N1+N2是二班的N2号(二班的最后一个序号);

x=N1+N2+1是三班1号……

以此类推……

x=sumN是m班的Nm号(m班的最后一个序号),全体同学的最后一个序号;

扫描二维码关注公众号,回复: 2358172 查看本文章

当x>sumN时,又回来从一班1号开始了:

x=sumN+1是一班1号,x=sumN+N1是一班的N1号;……

x=3sumN+N1+1是二班一号,x=3sumN+N1+N2是二班的N2号;……

x=sumN+sumN+...+sumN是m班的Nm号,全体同学的最后一个序号;……

按这样顺序把全体学生的序号排成一个圈,任给一个随机数x都可以代表唯一的一个学生序号。这个点名程序就做好了。

Input

输入的第一行为一个正整数m(1<=m<=26),表示有m个班。第二行有m个正整数N1,N2,...Nm,分别表示1班、2班……m班的人数,0<N1,N2,...,Nm<=50。

从第3行开始后的若干行:每行为一个整数,表示老师取得的随机数x,0<x<=10000,至EOF结束。

Output

输出多行,每行与输入的第3行开始对应,格式为:

Class 班号 : num

其中,班号为大写字母A~Z,表示1班~26班。num为被点名学生的(该班级内)序号。例如:

“Class A : 1”表示1班的1号;

“Class C : 10”表示3班的10号。


思路:

用数组储存起每个班的人数 将总人数相加算出周期 

录入一个数时用循环找到它所在的班级 输出它在这个班级的位置


代码:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int a[27];//记录班级个数
    int m;
    int i;
    scanf("%d",&m);
    int sum=0;
    int n;
    int count=0;
    int t,flag=0;
    for(i=0;i<m;i++)//将班级人数录入
    {
        scanf("%d",&a[i]);
        sum += a[i];
    }
    while(scanf("%d",&n)!=EOF)
    {
        while(n>sum)//计算出第一个周期内的n值
        {
            n -= sum;
        }
        for(i=0;i<m;i++)
        {
            count += a[i];//当加上某个班人数时超过n的值 n就存在于这个班内
            if(count>=n)
                {
                printf("Class %c : ",i+65); //输出字母 +65为ascll码值的 'a'
                printf("%d\n",n-flag);
                count = 0;//复原每次的count
                break;
                }
                flag += a[i];//计算出这之前其他班级人数的和
        }
        flag = 0;
    }
    return 0;
}


猜你喜欢

转载自blog.csdn.net/zhengyuan233/article/details/53324181