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班的最后一个序号),全体同学的最后一个序号;
当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;
}