int main() {
int N; // 数字的个数
while (scanf(“%d”, &N) != EOF) {
int numbers[N];
int sum = 0;
// 读取数字并计算它们的和
for (int i = 0; i < N; i++) {
scanf("%d", &numbers[i]);
sum += numbers[i];
}
// 计算平均数
int average = sum / N;
// 统计小于、等于和大于平均数的数字个数
int less = 0, equal = 0, greater = 0;
for (int i = 0; i < N; i++) {
if (numbers[i] < average) {
less++;
} else if (numbers[i] == average) {
equal++;
} else {
greater++;
}
}
// 输出结果
printf("%d %d %d\n", less, equal, greater);
}
return 0;
}
# 区间之和
problemId:2565
### Description
<p> </p>
<p>给定一个由 n 个整数组成的序列A1,A2,……, An 和两个整数L,R,你的任务是写一个程序来计算序列号在[L,R](这是一个闭区间) 这段位置区间内所有数的总和。</p>
<p> </p>
### Input
<p> </p>
<p>输入只有一组测试数据:</p>
<p>测试数据的第一行为一个整数 n (1< n < 10000);</p>
<p>第二行为 n 个 int 类型的整数;</p>
<p>第三行为两个整数 L,R(0 < L < R <= n)。</p>
### Ouput
<p> </p>
<p>输出序列号在区间[L,R]内所有数的和,数据保证和在 int 类型范围内。</p>
### samples
\<input\>-->
5
3 5 6 2 9
2 4
\<output\>-->
13
### Code
#include <stdio.h>
int main(){
int a,L,R;
scanf(“%d”,&a);
int num[a];
for(int i=0;i<a;i++){
scanf(“%d”,&num[i]);
}
scanf(“%d%d”,&L,&R);
a=0;
for( int i=L-1;i<=R-1;i++){
a+=num[i];
}
printf(“%d”,a);
return 0;
}
# 分割整数
problemId:1175
### Description
<p>从键盘输入一个长整数(不超过10位),从高位开始逐位分割并输出。</p>
### Input
<p>正整数n,不含前导零。</p>
### Ouput
<p>分割的整数序列,各整数之间用空格格开。<br />
注意,最后一个数字后面没有空格!</p>
### samples
\<input\>-->
678123
\<output\>-->
6 7 8 1 2 3
### Code
#include <stdio.h>
int main(){
int a,n=1,temp;
scanf(“%d”,&a);
temp=a;
while (temp/10!=0)
{
n++;
temp/=10;
}
int number[n];
for (int i = 0; i < n; i++)
{
number[n-i-1]=a%10;
a/=10;
}
for (int i = 0; i < n; i++)
{
if(i<n-1)
printf(“%d “,number[i]);
else
printf(“%d”,number[i]);
}
return 0;
}
# 众数
problemId:3740
### Description
<p>众数是指在一组数据中,出现次数最多的数。例如:1, 1, 3 中出现次数最多的数为 1,则众数为 1。</p>
<p>给定一组数,你能求出众数吗?</p>
### Input
<p>输入数据有多组(数据组数不超过 50),到 EOF 结束。</p>
<p>对于每组数据:</p>
<ul>
<li>第 1 行输入一个整数 n (1 <= n <= 10000),表示数的个数。</li>
<li>第 2 行输入 n 个用空格隔开的整数 Ai (0 <= Ai <= 1000),依次表示每一个数。</li>
</ul>
### Ouput
<p>对于每组数据,在一行中输出一个整数,表示这组数据的众数。</p>
<p>数据保证有唯一的众数。</p>
### samples
\<input\>-->
3
1 1 3
5
0 2 3 1 2
\<output\>-->
1
2
### Code
#include <stdio.h>
int main() {
int n;
while (scanf(“%d”, &n) != EOF) {
int count[1001] = {0}; // 用于统计每个数字出现的次数
int max_count = 0; // 最大出现次数
int mode = -1; // 众数
for (int i = 0; i < n; i++) {
int num;
scanf("%d", &num);
count[num]++; // 统计数字出现次数
if (count[num] > max_count) {
max_count = count[num]; // 更新最大出现次数
mode = num; // 更新众数
}
}
printf("%d\n", mode); // 输出众数
}
return 0;
}
# 小鑫爱运动
problemId:3103
### Description
<p>小鑫非常喜欢运动,有一次小鑫去参加110米栏的比赛,一共有10名比赛选手,小鑫是1号,由于跑的太专注,最后冲线的时候不知道自己是第几名,只知道每个人最后的成绩,聪明的你可不可以帮帮他?</p>
### Input
<p> 多组输入。</p>
<p>先输入一个10,<br />
然后每组输入10个整数,代表10个选手的110米栏成绩m,代表1号到N号的N个选手的成绩m,m范围是(0 < m < 100)。</p>
### Ouput
<p> 输出只有一行,代表小鑫最后的名次是多少。</p>
<p> 因为小鑫长得丑,成绩相同时,他总是排在前面。</p>
<p> </p>
### samples
\<input\>-->
10
2 5 3 9 7 10 23 12 43 5
10
6 1 7 9 3 4 8 3 2 9
\<output\>-->
1
6
### Code
#include <stdio.h>
#include <stdlib.h>
int main()
{ int N,m,i;
while(scanf(“%d”,&N)!=EOF)
{ int a[N];
int t=0;
scanf(“%d”,&m);
a[0]=m;
for(i=1;i<N;i++)
{scanf(“%d”,&m);
a[i]=m;
if(a[0]>a[i]) { t=t+1;}
}
printf("%d\n",t+1);
}
return 0;
}
# 数日子
problemId:1182
### Description
<p>光阴似箭,日月如梭,大学的时间真是宝贵,要抓紧时间AC^_^。你知道今天是这一年第几天吗,掐指一算还是要算好久,呵呵还是让计算机来做吧。这里的问题就是让你来写一个程序,输入某年某月某日,判断这一天是这一年的第几天?</p>
### Input
<p>输入第一行是数据的组数n<100,下面n行是n组数据,每组数据由3个正整数组成,分别为年、月、日,我们保证每组数据都是有效的日期。</p>
### Ouput
<p>输出所输入的日期是这一年的第几天。</p>
### samples
\<input\>-->
2
2009 1 1
2008 1 3
\<output\>-->
1
3
### Code
#include <stdio.h>
int main(){
int N,y,m,d,result,judge;
scanf(“%d”,&N);
for (int i = 0; i < N; i++)
{
result=0;
scanf(“%d%d%d”,&y,&m,&d);
if (y%4==0){
if (y%100!=0)
{
judge=1;
}
else if (y%100==0){
if (y%400==0)
{
judge=1;
}
else
judge=0;
}
}
else
judge=0;
for (int j = 1; j<m; j++)
{
if(j==1||j==3||j==5||j==7||j==8||j==10||j==12)
result+=31;
else if (j==4||j==6||j==9||j==11)
result+=30;
else{
if(judge)
result+=29;
else
result+=28;
}
}
result+=d;
printf("%d\n",result);
}
return 0;
}
### Code
#include<stdio.h>
int main() {
int N, y, m, d, result;
scanf(“%d”, &N);
for (int i = 0; i < N; i++) {
result = 0;
scanf("%d %d %d", &y, &m, &d);
int daysInMonth[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
// 判断是否是闰年
if ((y % 4 == 0 && y % 100 != 0) || (y % 400 == 0)) {
daysInMonth[2] = 29;
}
for (int j = 1; j < m; j++) {
result += daysInMonth[j];
}
result += d;
printf("%d\n", result);
}
return 0;
}
# 喵帕斯之平地摔
problemId:4126
### Description
<p><img alt="" src="/image/4126.png" /></p>
<p> </p>
<p>平地摔可是莲酱的特技!莲酱在平地都可以跌倒,更不用说陡峭的地方了。</p>
<p> </p>
<p>这里简化一下地面为一维数轴,a[i] 代表第 i 个位置的高度为 a[i]。</p>
<p>对于 a[i - 1] < a[i] > a[i + 1] 的地方被称为绊脚石,会让莲酱跌倒,注意第一个位置和最后一个位置不会成为绊脚石。</p>
<p> </p>
<p>现在莲酱想知道他从 1 位置走到 n 位置至少要跌到多少次。</p>
### Input
<p>多组输入直到EOF。(组数小于100)</p>
<p> </p>
<p>对于每组数据,首先输入一行包含一个正整数 n 。(1 <= n <= 100)</p>
<p>接下来一行包含 n 个正整数 a[i]。(1 <= a[i] <= 100)</p>
### Ouput
<p>对于每组数据输出一行,包含一个整数为莲酱要跌倒的次数。</p>
### samples
\<input\>-->
9
1 7 8 2 9 3 9 9 3
\<output\>-->
2
### Code
#include <stdio.h>
int main(){
int N,count;
while ((scanf(“%d”,&N))!=EOF)
{
int ground[N];
count=0;
for (int i = 0; i < N; i++)
scanf(“%d”,&ground[i]);
for (int i = 1; i < N-1; i++)
{
if(ground[i]>ground[i-1]&&ground[i]>ground[i+1]){
count++;
}
}
printf(“%d\n”,count);
}
return 0;
}
# 排序
problemId:1582
### Description
<p class="MsoNormal"><span ><span > 给你</span><span lang="EN-US">N(N<=100)</span><span >个数</span><span lang="EN-US">,</span><span >请你按照从小到大的顺序输出。</span></span></p>
### Input
<p class="MsoNormal"><span ><span > 输入数据第一行是一个正整数</span><span lang="EN-US">N,</span><span >第二行有</span><span lang="EN-US">N</span><span >个整数。</span></span></p>
### Ouput
<p class="MsoNormal"><span ><span > 输出一行,从小到大输出这</span><span lang="EN-US">N</span><span >个数,中间用空格隔开。</span></span></p>
### samples
\<input\>-->
5
1 4 3 2 5
\<output\>-->
1 2 3 4 5
### Code
#include <stdio.h>
int main(){
int N,temp;
scanf(“%d”,&N);
int arr[N];
for (int i = 0; i < N; i++)
scanf(“%d”,&arr[i]);
for (int i = N-1; i > 0; i—)
for (int j = 0; j <=i-1 ; j++)
{
if(arr[j]>arr[j+1]){
temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
for (int i = 0; i < N; i++)
printf(“%d “,arr[i]);
return 0;
}
# 排序问题
problemId:1196
### Description
输入10个整数,将它们从小到大排序后输出,并给出现在每个元素在原来序列中的位置。
### Input
输入数据有一行,包含10个整数,用空格分开。
### Ouput
输出数据有两行,第一行为排序后的序列,第二行为排序后各个元素在原来序列中的位置。
### samples
\<input\>-->
1 2 3 5 4 6 8 9 10 7
\<output\>-->
1 2 3 4 5 6 7 8 9 10
1 2 3 5 4 6 10 7 8 9
### Code
#include <stdio.h>
int main(){
int arr[10];
int arr_num[10];
int temp;
for (int i = 0; i < 10; i++){
scanf(“%d”,&arr[i]);
arr_num[i]=i;
}
for (int i = 9; i >0; i—)
for (int j = 0; j <= i-1; j++){
if (arr[j]>arr[j+1]){
temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
temp=arr_num[j];
arr_num[j]=arr_num[j+1];
arr_num[j+1]=temp;
}
}
for (int i = 0; i < 10; i++)
printf(“%d “,arr[i]);
printf(“\n”);
for (int i = 0; i < 10; i++)
printf(“%d “,arr_num[i]+1);
return 0;
}
# 数列有序!
problemId:1244
### Description
有n(n<=100)个整数,已经按照从小到大顺序排列好,现在另外给一个整数m,请将该数插入到序列中,并使新的序列仍然有序。
### Input
输入数据包含多个测试实例,每组数据由两行组成,第一行是n和m,第二行是已经有序的n个数的数列。n和m同时为0表示输入数据的结束,本行不做处理。
### Ouput
对于每个测试实例,输出插入新的元素后的数列。
### samples
\<input\>-->
3 3
1 2 4
0 0
\<output\>-->
1 2 3 4
### Code
#include <stdio.h>
int main() {
int n, m;
while (1) {
scanf("%d %d", &n, &m);
if (n == 0 && m == 0)
break;
int sequence[105]; // 假设最多有100个整数
int i;
for (i = 0; i < n; i++) {
scanf("%d", &sequence[i]);
}
// 在有序序列中找到插入位置
for (i = n - 1; i >= 0 && sequence[i] > m; i--) {
sequence[i + 1] = sequence[i];
}
// 插入新的整数
sequence[i + 1] = m;
n++; // 更新序列长度
// 输出新序列
for (i = 0; i < n; i++) {
printf("%d ", sequence[i]);
}
printf("\n");
}
return 0;
}
# 中位数
problemId:3739
### Description
<p>中位数是指在一组数据中,按数值大小排序后处于中间位置的数。例如:1, 5, 3 排序后为 1, 3, 5,则其中位数为 3。特别地,当数的个数 N 为偶数时,中位数取位置居中的两个数 (N/2 和 N/2+1) 的平均值,例如:1, 2, 3, 4,中位数为 (2+3)/2 = 2.5。</p>
<p>给定一组数,你能求出中位数吗?</p>
### Input
<p>输入数据有多组(数据组数不超过 100),到 EOF 结束。</p>
<p>对于每组数据:</p>
<ul>
<li>第 1 行输入一个整数 n (3 <= n <= 100),表示数的个数。</li>
<li>第 2 行输入 n 个用空格隔开的整数 Ai (0 <= Ai <= 1000),依次表示每一个数,保证互不重复。</li>
</ul>
### Ouput
<p>对于每组数据,在一行中输出一个实数(保留 1 位小数),表示这组数据的中位数。</p>
### samples
\<input\>-->
3
1 5 3
4
1 2 3 4
\<output\>-->
3.0
2.5
### Code
#include <stdio.h>
int main(){
int N,temp;
int arr[100];
float result;
while ((scanf(“%d”,&N)) != EOF){
for (int i = 0; i < N; i++)
scanf(“%d”,&arr[i]);
for (int i = N-1; i >0; i—)
for (int j = 0; j < i; j++){
if(arr[j]>arr[j+1]){
temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
if (N%2==1)
printf(“%.1f\n”,(float)arr[(N+1)/2-1]);
else
printf(“%.1f\n”,(arr[N/2-1]+arr[N/2])/2.0);
}
return 0;
}
# 各位数字之和排序
problemId:1188
### Description
<p>给定n个正整数,根据各位数字之和从小到大进行排序。</p>
### Input
<p>输入数据有多组,每组数据占一行,每行的第一个数正整数n,表示整数个数,后面接n个正整数。当n为0时,不作任何处理,输入结束。n<=10</p>
### Ouput
<p>输出每组排序的结果。</p>
### samples
\<input\>-->
3 230 59 110
5 199 220 108 235 120
0
\<output\>-->
110 230 59
120 220 108 235 199
### Code
#include <stdio.h>
int main(){
int sum,N,num,num_c;
int arr[28];
while(1){
scanf(“%d”,&N);
if(N==0)
break;
sum=0;
int arr[28]={};
for (int i = 0; i < N; i++){
scanf("%d",&num);
num_c=num;
sum=0;
if (num==0)
printf("%d ",0);
while (num/10!=0){
sum+=num%10;
num/=10;
}
sum+=num;
arr[sum]=num_c;
}
for (int i = 0; i < 28; i++)
if (arr[i]!=0)
printf("%d ",arr[i]);
printf("\n");
}
return 0;
}
# 期末考试之排名次
problemId:2255
### Description
<p>期末考试结束了,童鞋们的成绩也出来的了,可是为了排名次可忙坏了老师,因为学生太多了。这时,老师把这个任务交给了你,希望你能帮老师完成。作为IT人,你当然不能用笨笨的人工方法了,编程解决才是好办法。<br />
共有三门课,语文、数学和英语,要求根据学生的各科成绩计算出其总成绩,并根据总成绩从高到低排序。</p>
### Input
第一行一个整数N(N<=100),代表学生的人数。<br />
接下来的N行数据,每行有三个整数,C,M,E分别代表一个学生语文、数学和英语的成绩。
### Ouput
一共N行,每行一个数,从大到小,分别代表各个学生的总成绩。
### samples
\<input\>-->
3
70 80 90
59 59 59
100 100 100
\<output\>-->
300
240
177
### Code
#include <stdio.h>
int main(){
int N,a,b,c;
int temp;
scanf(“%d”,&N);
int arr[N];
for (int i = 0; i < N; i++){
scanf(“%d%d%d”,&a,&b,&c);
arr[i]=a+b+c;
}
for (int i = N-1; i >0; i—)
for (int j = 0; j < i; j++)
if(arr[j]>arr[j+1]){
temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
for (int i = 0; i < N; i++)
printf(“%d\n”,arr[N-i-1]);
return 0;
}
# 次大和次小
problemId:3738
### Description
<p>对于一个数组,次大的数指数组中第二大的数,相似地,次小的数指数组中第二小的数。</p>
<p>给定一个含有 n 个数的数组(数组中的数互不相同),求其中次大的数和次小的数。</p>
### Input
<p>首先输入一个整数 T (1 <= T <= 200),表示数据组数。</p>
<p>对于每组数据:</p>
<ul>
<li>第 1 行输入一个整数 n (2 <= n <= 1000),表示数组中元素的数量。</li>
<li>第 2 行输入 n 个用空格隔开的整数 Ai (-10000 <= Ai <= 10000),表示数组中每一个元素的值。</li>
</ul>
### Ouput
<p>对于每组数据,输出一行,包含 2 个整数 a, b,分别表示次大和次小的数。</p>
### samples
\<input\>-->
1
5
3 1 2 4 5
\<output\>-->
4 2
### Code
#include <stdio.h>
int main(){
int T,n,temp,a,b;
scanf(“%d”,&T);
for (int i = 0; i < T; i++){
scanf(“%d”,&n);
int arr[n];
for (int i = 0; i < n; i++)
scanf(“%d”,&arr[i]);
for (int i = n-1; i >0; i—)
for (int j = 0; j < i; j++){
if(arr[j]>arr[j+1]){
temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
printf(“%d %d\n”,arr[n-2],arr[1]);
}
return 0;
}
# 冒泡排序中数据交换的次数
problemId:2554
### Description
<p>听说过冒泡排序么?一种很暴力的排序方法。今天我们不希望你用它来排序,而是希望你能算出从小到大冒泡排序的过程中一共进行了多少次数据交换。</p>
### Input
<p>输入数据的第一行为一个正整数 T ,表示有 T 组测试数据。<br />
接下来T行,每行第一个整数N, 然后有N个整数,无序。0<N <= 100</p>
### Ouput
<p>输出共 T 行。<br />
每行一个整数,代表本行数据从小到大冒泡排序所进行的交换次数。</p>
### samples
\<input\>-->
3
5 1 2 3 4 5
4 5 3 7 1
2 2 1
\<output\>-->
0
4
1
### Code
#include <stdio.h>
int main(){
int T,n,temp,a,b,number;
scanf(“%d”,&T);
for (int i = 0; i < T; i++){
number=0;
scanf(“%d”,&n);
int arr[n];
for (int i = 0; i < n; i++)
scanf(“%d”,&arr[i]);
for (int i = n-1; i >0; i—)
for (int j = 0; j < i; j++){
if(arr[j]>arr[j+1]){
temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
number++;
}
}
printf(“%d\n”,number);
}
return 0;
}
# 小金追呀追不上妹子
problemId:3426
### Description
<p>众所周知,C语言的学习是我们程序设计基础的重点和主要内容。<br />
小金知道他喜欢的妹子最喜欢的水果是苹果,但是小金是种玉米的哪!所以他为了讨好妹子的欢心,他会从收获的n个玉米中挑选出m个最大的玉米去抠脚大汉那里换苹果,问题是,他这m个玉米的价值有多大?</p>
### Input
<p>多组输入。<br />
每行开始输入两个整数分别为n,m。代表含义如题目所述。<br />
接下来一行有n个整数,代表每个玉米的价值。<br />
1 < = m < n < = 1000 </p>
### Ouput
<p>输出小金m个最大玉米的总价值。<br />
输出占一行,保证数据合法。</p>
### samples
\<input\>-->
10 4
1 2 3 4 5 6 7 8 9 10
5 3
1 2 3 4 5
\<output\>-->
34
12
### Code
#include <stdio.h>
int main(){
int n,num,temp;
while(scanf(“%d”,&n)!=EOF){
int result=0;
int arr[n];
scanf(“%d”,&num);
for (int i = 0; i < n; i++)
scanf(“%d”,&arr[i]);
for (int i = n-1; i >0; i—)
for (int j = 0; j < i; j++){
if(arr[j]>arr[j+1]){
temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
for (int i = n-num; i < n; i++)
result+=arr[i];
printf(“%d\n”,result);
}
return 0;
}
# 数组逆序
problemId:1186
### Description
<p>有n个整数,使其最后m个数变成最前面的m个数,其他各数顺序向后移m(m < n < 100)个位置。</p>
### Input
<p>输入数据有2行,第一行的第一个数为n,后面是n个整数,第二行整数m。</p>
### Ouput
<p>按先后顺序输出n个整数。</p>
### samples
\<input\>-->
5 1 2 3 4 5
2
\<output\>-->
4 5 1 2 3
### Code
#include <stdio.h>
int main(){
int n,m,i;
scanf(“%d”,&n);
int arr[n];
for(i=0;i<n;i++)
scanf(“%d”,&arr[i]);
scanf(“%d”,&m);
for(i=n-m;i<n;i++)
printf(“%d “,arr[i]);
for (i = 0; i < n-m; i++)
printf(“%d “,arr[i]);
return 0;
}
# 矩阵输出
problemId:1523
### Description
<p>输入n个整数,输出由这些整数组成的n行矩阵。</p>
### Input
<p>第一行输入一个正整数N(N<=20),表示后面要输入的整数个数。<br />
下面依次输入N个整数。</p>
### Ouput
<p>以输入的整数为基础,输出有规律的n行数据。</p>
### samples
\<input\>-->
5
3 6 2 5 8
\<output\>-->
3 6 2 5 8
8 3 6 2 5
5 8 3 6 2
2 5 8 3 6
6 2 5 8 3
### Code
#include <stdio.h>
int main(){
int N;
scanf(“%d”,&N);
int arr[20];
for (int i = 0; i < N; i++)
scanf(“%d”,&arr[i]);
for (int i = 0; i < N; i++)
{
for (int j = N-i; j < N; j++)
printf(“%d “,arr[j]);
for (int j = 0; j < N-i; j++)
printf(“%d “,arr[j]);
printf(“\n”);
}
return 0;
}