7-2 分数统计 (10 分)
老师想统计学生考试排名,假定一共有n名学生,学号为1至n。现按学号递增顺序给定每个学生的分数,请编写程序,帮助老师计算:对于每个学生,他的成绩比多少人高。假定考试满分为1000分,成绩均为整数。
输入格式:
输入第一行为1个整数n(0<n≤105),为学生人数。第二行为n个空格间隔的整数a1a2…an表示学号1至n的学生的考试成绩。
输出格式:
输出n个整数b1 b2 ... bn,每个整数后一个空格,bi(1≤i≤n)表示比学生i成绩低的学生人数。
输入样例1:
5 80 10 20 20 30
输出样例1:
4 0 1 1 3
解释1:
a1=80,比4个人成绩高。
a2=10,比0个人成绩高。
a3=20,比1个人成绩高。
a4=20,比1个人成绩高。
a5=30,比3个人成绩高。
输入样例2:
9 10 20 30 40 50 60 70 80 90
输出样例2:
0 1 2 3 4 5 6 7 8
数据规模:
测试点0:n=10;
测试点1:n=100;
测试点2:n=1000;
测试点3−4:n=100000。
来自pintia,后两个一直超时,排序,二分法都没有用,还是易大佬救的命
#include<stdio.h>
int main()
{
int a[100010],b[1000]={0},n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
for(int j=a[i]+1;j<=1000;j++)
{
b[j]++;
}
}
for(int i=1;i<=n;i++)
{
printf("%d ",b[a[i]]);
}
}
7-1 列出完数 (10 分)
输入一个整数n,要求输出[1,n]范围内的所有完数。完数是一个正整数,该数恰好等于其所有不同真因子之和。例如,6、28是完数,因为6=1+2+3,28=1+2+4+7+14;而24不是完数,因为24≠1+2+3+4+6+8+12=36。
输入格式:
测试数据有多组,处理到文件尾。每组测试数据输入一个整数n(1≤n≤10000)。
输出格式:
对于每组测试,首先输出n和一个冒号“:”;然后输出所有不大于n的完数(每个数据之前留一个空格);若[1,n]范围内不存在完数,则输出“NULL”。引号不必输出。具体输出格式参考输出样例。
输入样例:
100 5000 5
输出样例:
100: 6 28 5000: 6 28 496 5: NULL
出处:
ZJUTOJ 1190
这道题是因为超纲了。。。没学过EOF的应用
#include<stdio.h>
#include<math.h>
#define M 10010
int a[M];
int main()
{
int n,i=1;
while(scanf("%d",&n)!=EOF)
{
a[i]=n;
i++;
}
i--;
int sum,flag;
n=i;
for(int i=1;i<=n;i++)
{
flag=0;
printf("%d:",a[i]);
for(int j=2;j<=a[i];j++)
{
sum=1;
for(int k=2;k<=sqrt(j);k++)
{
if(j%k==0)
{
sum+=k;
sum+=j/k;
}
}
if(sum==j)
{
printf(" %d",j);
flag=1;
}
}
if(flag==0)
{
printf(" NULL");
}
printf("\n");
}
}
最后没用sqrt还是超时,看来算法能简便就要简便,要求最高效率