C语言,一维数组实验五

A - C语言实验——最值

描述

有一个长度为n的整数序列,其中最大值和最小值不会出现在序列的第一和最后一个位置。

请写一个程序,把序列中的最小值与第一个数交换,最大值与最后一个数交换。输出转换好的序列。

输入

输入包括两行。

第一行为正整数n(1≤n≤10)。

第二行为n个正整数组成的序列。

输出

输出转换好的序列。数据之间用空格隔开。

样本

输入

6

2 3 8 1 4 5

输出

1 3 5 2 4 8

//其实前四个实验我并没有将一些琐碎的知识点给标注出来,虽然并不影响C语言的学习,但恰巧这也是底蕴的一部分,即使你已经学会了至少一种解决方法。

#include<stdio.h>
int main()
{
int a[10];//注意传统的数组不允许动态定义,即int n;输入n然后int a[n];
int n,max=0,min=0,i,t;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
for(i=0;i<n;i++)
{
if(a[i]>a[max])
{
max=i;
}
if(a[i]<a[min])
{
min=i;
}
}
t=a[max];
a[max]=a[n-1];
a[n-1]=t;
t=a[min];
a[min]=a[0];
a[0]=t;
for(i=0;i<n;i++)
{
printf("%d ",a[i]);
}
return 0;
}

B - C语言实验——整数位

描述

输入一个不多于5位的正整数,要求:

(1)求出它是几位数;

(2)分别输出每一位数字;

(3)按逆序输出各位数字。

输入

输入一个不多于5位的正整数。

输出

输出数据有3行,第一行为正整数位数,第二行为各位数字,第三行为逆序的各位数字。

样本

输入

123

输出

3

1 2 3

3 2 1

//嘿嘿,是不是发现输入输出中有没见过的东西,%i是什么东西?这道题之后你就知道了。

#include<stdio.h>
int main()
{
int a[5],n,i,count=0;
scanf("%i",&n);
for(i=0;n>0;i++)
{
a[i]=n%10;
n=n/10;
count++;
}
printf("%i\n",count);
for(i=count-1;i>=0;i--)
{
printf("%i ",a[i]);
}
printf("\n");
for(i=0;i<count;i++)
{
printf("%i ",a[i]);
}
return 0;
}

C - 小鑫数数儿

描述

某天小鑫忽然得到了许多的数字,他很好学,老师给他布置了一个任务,求出这些数字中,小于他们平均数、等于他们平均数、大于他们平均数的数字的数量是多少。(对于出现的平均数,保证都是整数,不会出现浮点数)

输入

 多组输入。

对于每次的输入,第一行一个整数N(1 <= N <= 10),代表数字的个数。

接下来的一行,输入N个整数M(0 <= M <= 100)。

输出

 输出包含三个数,第一个跟第二个数后面是空格,最后一个数后面是换行。

第一个数是这些数字中小于他们平均数的数字的个数,第二个数为等于他们平均数的数字的个数,第三个数为大于他们平均数的数字的个数。

样本

输入

3

1 2 3

5

2 4 4 5 5

输出

1 1 1

1 2 2

//这个阶段你必须学会用+=来代替a=a+b了。

#include<stdio.h>
int main()
{
int N,M[10],i,sum,da,deng,xiao;
for(;scanf("%d",&N)!=EOF;)
{
da=0;
deng=0;
xiao=0;
sum=0;
for(i=0;i<N;i++)
{
scanf("%d",&M[i]);
sum+=M[i];
}
sum/=N;
for(i=0;i<N;i++)
{
if(M[i]>sum)
{
da++;
}
if(M[i]==sum)
{
deng++;
}
if(M[i]<sum)
{
xiao++;
}
}
printf("%d %d %d\n",xiao,deng,da);
}
return 0;
}

D - 区间之和

描述

给定一个由 n 个整数组成的序列A1,A2,......, An 和两个整数L,R,你的任务是写一个程序来计算序列号在[L,R](这是一个闭区间) 这段位置区间内所有数的总和。

输入

输入只有一组测试数据:

测试数据的第一行为一个整数 n (1< n < 10000);

第二行为 n 个 int 类型的整数;

第三行为两个整数 L,R(0 < L < R <= n)。

输出

输出序列号在区间[L,R]内所有数的和,数据保证和在 int 类型范围内。

样本

输入

5

3 5 6 2 9

2 4

输出

13

//嗯,这个数组有点大了,解决实际问题根本不必要,当然这是在做题!

//这格式怎么都是向左对齐的?咱这格式就这样,习惯了……

#include<stdio.h>
int main()
{
int a[10000],n,i,L,R,sum=0;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
scanf("%d%d",&L,&R);
for(i=1;i<=n;i++)
{
if(i>=L&&i<=R)
{
sum+=a[i];
}
}
printf("%d",sum);
return 0;
}

E - C语言实验——分割整数

描述

从键盘输入一个长整数(不超过10位),从高位开始逐位分割并输出。

输入

正整数n,不含前导零。

输出

分割的整数序列,各整数之间用空格格开。

注意,最后一个数字后面没有空格!

样本

输入

678123

输出

6 7 8 1 2 3

//这道题没什么好说的,很基础。当然基础题的做法并不意味着你能一看就懂,看到i--了没?

#include<stdio.h>
int main()
{
int n,a[10],i;
scanf("%d",&n);
for(i=0;n>0;i++)
{
a[i]=n%10;
n/=10;
}
for(i--;i>=0;i--)
{
if(i==0)
{
printf("%d",a[i]);
}
else
{
printf("%d ",a[i]);
}
}
return 0;
}

F - 众数

描述

众数是指在一组数据中,出现次数最多的数。例如:1, 1, 3 中出现次数最多的数为 1,则众数为 1。

给定一组数,你能求出众数吗?

输入

输入数据有多组(数据组数不超过 50),到 EOF 结束。

对于每组数据:

第 1 行输入一个整数 n (1 <= n <= 10000),表示数的个数。

第 2 行输入 n 个用空格隔开的整数 Ai (0 <= Ai <= 1000),依次表示每一个数。

输出

对于每组数据,在一行中输出一个整数,表示这组数据的众数。

数据保证有唯一的众数。

样本

输入

3

1 1 3

5

0 2 3 1 2

输出

1

2

//还记得多组输入吗,忘了的话可以看看以前的实验。

//没想到还能b[Ai[i]]++;吧,这是可以的。

#include<stdio.h>
int main()
{
int n,Ai[10000],i,q;
for(;scanf("%d",&n)!=EOF;)
{
int b[1001]={0},max=0;
for(i=0;i<n;i++)
{
scanf("%d",&Ai[i]);
b[Ai[i]]++;
}
for(i=0;i<=1000;i++)
{
if(b[i]>max)
{
max=b[i];
q=i;
}
}
printf("%d\n",q);
}
return 0;
}

//虽然以上的代码比较简短,但是数组却存在大量的无效元素,并且存在大量无效循环,造成效率低下。

//两种方法总比一种好。

#include<stdio.h>
int main()
{
int n,Ai[9999],ai,i,j,k,flag1,flag2,max;
for(;scanf("%d",&n)!=EOF;)
{
int b[1001]={0};//Ai的值从0至1000最多1001种
flag1=0;//旗标1代表所出现的数的种类。
for(i=0;i<n;i++)
{
flag2=0;//旗标2判断是否出现了新种类的数。
scanf("%d",&ai);
for(j=0;j<=flag1;j++)
{//寻找输入的数是否已存在。
if(Ai[j]==ai)
{
b[j]++;
flag2++;
break;
}
}
if(flag2==0)
{
Ai[flag1++]=ai;
}
}
max=0;
for(i=0;i<=flag1;i++)
{
if(b[i]>max)
{
max=b[i];
k=i;
}
}
printf("%d\n",Ai[k]);
}
return 0;
}

G - 小鑫爱运动

描述

小鑫非常喜欢运动,有一次小鑫去参加110米栏的比赛,一共有10名比赛选手,小鑫是1号,由于跑的太专注,最后冲线的时候不知道自己是第几名,只知道每个人最后的成绩,聪明的你可不可以帮帮他?

输入

多组输入。

先输入一个10,

然后每组输入10个整数,代表10个选手的110米栏成绩m,代表1号到N号的N个选手的成绩m,m范围是(0 < m < 100)。

输出

输出只有一行,代表小鑫最后的名次是多少。

因为小鑫长得丑,成绩相同时,他总是排在前面。

样本

输入

10

2 5 3 9 7 10 23 12 43 5

10

6 1 7 9 3 4 8 3 2 9

输出

1

6

//吉祥物小鑫又出现了,后面跟着一大串问题。

#include<stdio.h>
int main()
{
int n,i,m[10],rank;
for(;scanf("%d",&n)!=EOF;)
{
rank=1;
for(i=0;i<n;i++)
{
scanf("%d",&m[i]);
}
for(i=0;i<n;i++)
{
if(m[0]>m[i])
{
rank++;
}
}
printf("%d\n",rank);
}
return 0;
}

H - C语言实验——数日子

描述

光阴似箭,日月如梭,大学的时间真是宝贵,要抓紧时间AC^_^。你知道今天是这一年第几天吗,掐指一算还是要算好久,呵呵还是让计算机来做吧。这里的问题就是让你来写一个程序,输入某年某月某日,判断这一天是这一年的第几天?

输入

输入第一行是数据的组数n<100,下面n行是n组数据,每组数据由3个正整数组成,分别为年、月、日,我们保证每组数据都是有效的日期。

输出

输出所输入的日期是这一年的第几天。

样本

输入

2

2009 1 1

2008 1 3

输出

1

3

//天啊,不会有人忘了闰年吧!我在考虑要不要将实验二有闰年的配图的消息告诉你,回想一下那道题还是那么的难……

#include<stdio.h>
int main()
{
int a[11]={31,28,31,30,31,30,31,31,30,31,30},count,year,month,day,sum,i;
scanf("%d",&count);
for(;count>0;count--)
{
scanf("%d%d%d",&year,&month,&day);
sum=day;
for(i=0;i<month-1;i++)
{
sum+=a[i];
}
if((month>2)&&((year%400==0)||((year%4==0)&&(year%100!=0))))
{//别忘了判断闰年!
sum+=1;
}
printf("%d\n",sum);
}
return 0;
}

I - 喵帕斯之平地摔

描述

e308959268f9406aae0458796f77069d.jpg

平地摔可是莲酱的特技!莲酱在平地都可以跌倒,更不用说陡峭的地方了。

这里简化一下地面为一维数轴,a[i] 代表第 i 个位置的高度为 a[i]。

对于 a[i - 1] < a[i] > a[i + 1] 的地方被称为绊脚石,会让莲酱跌倒,注意第一个位置和最后一个位置不会成为绊脚石。

现在莲酱想知道他从 1 位置走到 n 位置至少要跌到多少次。

输入

多组输入直到EOF。(组数小于100)

对于每组数据,首先输入一行包含一个正整数 n 。(1 <= n <= 100)

接下来一行包含 n 个正整数 a[i]。(1 <= a[i] <= 100)

输出

对于每组数据输出一行,包含一个整数为莲酱要跌倒的次数。

样本

输入

9

1 7 8 2 9 3 9 9 3

输出

2

提示

输入的示例中,第三个位置 8 和第五个位置 9 是绊脚石,总共两个绊脚石。

//其实配图是这道题一开始就有的。

#include<stdio.h>
int main()
{
int a[100],n,sum,i;
for(;scanf("%d",&n)!=EOF;)
{
sum=0;
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
for(i=1;i<n-1;i++)
{
if(a[i]>a[i+1]&&a[i]>a[i-1])
{
sum+=1;
}
}
printf("%d\n",sum);
}
return 0;
}

J - 排序

描述

给你N(N<=100)个数,请你按照从小到大的顺序输出。

输入

输入数据第一行是一个正整数N,第二行有N个整数。

输出

    输出一行,从小到大输出这N个数,中间用空格隔开。

样本

输入

5

1 4 3 2 5

输出

1 2 3 4 5

提示

//排序问题,这是你必须会的!!!不要认为你会一种方法就可以高枕无忧了,你必须全部学会。

//什么,快速排序是怎么回事,怎么看不懂啊,难道超纲了?因为你除了数组还必须学会函数、指针……,等你学会了就会发现快速排序的判断和交换次数远少于其他方法,不要认为难就不基础,对了,听说有人学完后又将知识还回去了,结果到最后还是看不懂。

排序问题是在数组中很常见的一种问题,一般来说,常用的排序方式有选择排序、冒泡排序和快速排序。

选择排序和冒泡排序主要是将筛选出来的数向某一方向交换移动,选择排序和冒泡排序的不同主要是在数值交换时对内外循环的使用,与此同时,其中的判断条件可以是前(后)者比后(前)者大或者小,满足条件则交换。

快速排序的主要思想是对函数的多次递归调用,选取第一个数,使其大于或小于该数的数交换到该数的同一侧,然后对该数两边分别调用该函数。

#include<stdio.h>
int main()
{//选择排序
int a[100],N,i,j,t;
scanf("%d",&N);
for(i=0;i<N;i++)
{
scanf("%d",&a[i]);
}
for(i=0;i<N-1;i++)
{
for(j=i+1;j<=N-1;j++)
{
if(a[i]>a[j])
{
a[i]=a[i]+a[j];
a[j]=a[i]-a[j];
a[i]=a[i]-a[j];
}
}
}
for(i=0;i<N-1;i++)
{
printf("%d ",a[i]);
}
printf("%d\n",a[N-1]);
return 0;
}

//当然选择排序中有大量的多余交换,我们可以用赋值的方式先将最小(大)元素记录下来,用来代替这些交换,直到循环最后再交换,避免多余交换 

#include<stdio.h>
int main()
{
int N,a[100],i,j,k;
scanf("%d",&N);
for(i=0;i<N;i++)
{
scanf("%d",&a[i]);
}
for(i=0;i<N-1;i++)
{
k=i;
for(j=i+1;j<=N-1;j++)
{
if(a[k]>a[j])
{
k=j;
}
}
if(k!=i)
{
a[i]=a[i]+a[k];
a[k]=a[i]-a[k];
a[i]=a[i]-a[k];
}
}
for(i=0;i<=N-1;i++)
{
printf("%d ",a[i]);
}
return 0;
}

#include<stdio.h>
int main()
{//冒泡排序
int N,a[100],i,j;
scanf("%d",&N);
for(i=0;i<N;i++)
{
scanf("%d",&a[i]);
}
for(i=0;i<N-1;i++)
{
for(j=0;j<N-i-1;j++)
{
if(a[j]>a[j+1])
{
a[j]=a[j]+a[j+1];
a[j+1]=a[j]-a[j+1];
a[j]=a[j]-a[j+1];
}
}
}
for(i=0;i<N-1;i++)
{
printf("%d ",a[i]);
}
printf("%d\n",a[N-1]);
return 0;
}

#include<stdio.h>
void kuaipai(int a[],int zuo,int you)
{
if(zuo>=you)
{//左边界小于右边界
return ;
}
else
{
int x=a[zuo],i=zuo,j=you;
while(i<j)
{//使x的左边都是小于x的,x的右边都是大于x的
while((i<j)&&(a[j]>=x))
{//找到自右起第一个小于x的元素
j--;
}
a[i]=a[j];
while((i<j)&&(a[i]<=x))
{//找到自左起第一个大于x的元素
i++;
}
a[j]=a[i];
}
a[i]=x;
kuaipai(a,zuo,i-1);
kuaipai(a,i+1,you);
}
}
int main()
{//快速排序
int N,array[100],i;
scanf("%d",&N);
for(i=0;i<=N-1;i++)
{
scanf("%d",&array[i]);
}
kuaipai(array,0,N-1);
for(i=0;i<=N-1;i++)
{
printf("%d ",array[i]);
}
return 0;
}

K - 排序问题

描述

输入10个整数,将它们从小到大排序后输出,并给出现在每个元素在原来序列中的位置。

输入

输入数据有一行,包含10个整数,用空格分开。

输出

输出数据有两行,第一行为排序后的序列,第二行为排序后各个元素在原来序列中的位置。

样本

输入

1 2 3 5 4 6 8 9 10 7

输出

1 2 3 4 5 6 7 8 9 10

1 2 3 5 4 6 10 7 8 9

//上一道题学会了,这一道题还会难吗?

#include<stdio.h>
int main()
{
int a[10],b[10],i,j;
for(i=0;i<10;i++)
{
scanf("%d",&a[i]);
b[i]=a[i];
}
for(i=0;i<9;i++)
{
for(j=i+1;j<10;j++)
{
if(a[i]>a[j])
{
a[i]=a[i]+a[j];
a[j]=a[i]-a[j];
a[i]=a[i]-a[j];
}
}
}
for(i=0;i<10;i++)
{
printf("%d ",a[i]);
}
printf("\n");
for(i=0;i<10;i++)
{
for(j=0;j<10;j++)
{
if(a[i]==b[j])
{
printf("%d ",j+1);
}
}
}
return 0;
}

L - 数列有序!

描述

有n(n<=100)个整数,已经按照从小到大顺序排列好,现在另外给一个整数m,请将该数插入到序列中,并使新的序列仍然有序。

输入

输入数据包含多个测试实例,每组数据由两行组成,第一行是n和m,第二行是已经有序的n个数的数列。n和m同时为0表示输入数据的结束,本行不做处理。

输出

对于每个测试实例,输出插入新的元素后的数列。

样本

输入

3 3

1 2 4

0 0

输出

1 2 3 4

//如果你学会了排序,这道题并不会做不出来,也就多花点时间的事,那样你的知识会记得更牢。

#include<stdio.h>
int main()
{
int n,m,a[101],i,j;
for(;scanf("%d%d",&n,&m)!=EOF&&n&&m;)
{
a[0]=m;
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
for(i=0;i<n;i++)
{
for(j=i+1;j<=n;j++)
{
if(a[i]>a[j])
{
a[i]=a[i]+a[j];
a[j]=a[i]-a[j];
a[i]=a[i]-a[j];
}
}
}
for(i=0;i<=n;i++)
{
printf("%d ",a[i]);
}
}
return 0;
}

M - 中位数

描述

中位数是指在一组数据中,按数值大小排序后处于中间位置的数。例如:1, 5, 3 排序后为 1, 3, 5,则其中位数为 3。特别地,当数的个数 N 为偶数时,中位数取位置居中的两个数 (N/2 和 N/2+1) 的平均值,例如:1, 2, 3, 4,中位数为 (2+3)/2 = 2.5。

给定一组数,你能求出中位数吗?

输入

输入数据有多组(数据组数不超过 100),到 EOF 结束。

对于每组数据:

第 1 行输入一个整数 n (3 <= n <= 100),表示数的个数。

第 2 行输入 n 个用空格隔开的整数 Ai (0 <= Ai <= 1000),依次表示每一个数,保证互不重复。

输出

对于每组数据,在一行中输出一个实数(保留 1 位小数),表示这组数据的中位数。

样本

输入

3

1 5 3

4

1 2 3 4

输出

3.0

2.5

//哦,该温习一下多组输入了,当然,如果你不想排序的话也可以试试第二个,虽然效率低点,问题不会只有一种解决办法的,谁说的一定要排序?

#include<stdio.h>
int main()
{
int n,Ai[1000],i,j;
double aver;
for(;scanf("%d",&n)!=EOF;)
{
for(i=0;i<n;i++)
{
scanf("%d",&Ai[i]);
}
for(i=0;i<n-1;i++)
{
for(j=0;j<n-i-1;j++)
{
if(Ai[j]>Ai[j+1])
{
Ai[j]=Ai[j]+Ai[j+1];
Ai[j+1]=Ai[j]-Ai[j+1];
Ai[j]=Ai[j]-Ai[j+1];
}
}
}
if(n%2==1)
{
aver=Ai[(n-1)/2]*1.0;
}
else
{
aver=(Ai[n/2-1]+Ai[n/2])/2.0;
}
printf("%.1lf\n",aver);
}
return 0;
}

//实际上,如果我不排序又如何,会影响求出中位数么?

#include<stdio.h>
int main()
{
int n,Ai[1000],i,j,count;
double aver;
while(~scanf("%d",&n))
{
aver=0;
for(i=0;i<n;i++)
{
scanf("%d",&Ai[i]);
}
for(i=0;i<n;i++)
{
count=0;
for(j=0;j<n;j++)
{
if(Ai[i]<Ai[j])
{
count++;
}
}
if(n%2==1&&count==(n-1)/2)
{
aver=Ai[i]*1.0;
break;
}
else if(n%2==0&&(count==(n/2-1))||(count==(n/2)))
{
aver=aver+Ai[i]/2.0;
}
}
printf("%.1lf\n",aver);
}
return 0;
}

N - C语言实验——各位数字之和排序

描述

给定n个正整数,根据各位数字之和从小到大进行排序。

输入

输入数据有多组,每组数据占一行,每行的第一个数正整数n,表示整数个数,后面接n个正整数。当n为0时,不作任何处理,输入结束。n<=10

输出

输出每组排序的结果。

样本

输入

3 230 59 110

5 199 220 108 235 120

0

输出

110 230 59

120 220 108 235 199

//众所周知,%的优先级还是很高的。

//输出的最后没有空格就很离谱,使我多花了一分钟多打了7行代码。

#include<stdio.h>
int main()
{
int n,a[10],sum[10],i,j,p;
for(;scanf("%d",&n)!=EOF&&n;)
{
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
p=a[i];
sum[i]=0;
while(p>0)
{
sum[i]+=p%10;
p/=10;
}
}
for(i=0;i<n-1;i++)
{
for(j=i+1;j<n;j++)
{
if(sum[i]>sum[j])
{
a[i]=a[i]+a[j];
a[j]=a[i]-a[j];
a[i]=a[i]-a[j];
sum[i]=sum[i]+sum[j];
sum[j]=sum[i]-sum[j];
sum[i]=sum[i]-sum[j];
}
}
}
for(i=0;i<n;i++)
{
if(i!=n-1)
{
printf("%d ",a[i]);
}
else
{
printf("%d\n",a[i]);
}
}
}
return 0;
}

O - 期末考试之排名次

描述

期末考试结束了,童鞋们的成绩也出来的了,可是为了排名次可忙坏了老师,因为学生太多了。这时,老师把这个任务交给了你,希望你能帮老师完成。作为IT人,你当然不能用笨笨的人工方法了,编程解决才是好办法。

共有三门课,语文、数学和英语,要求根据学生的各科成绩计算出其总成绩,并根据总成绩从高到低排序。

输入

第一行一个整数N(N<=100),代表学生的人数。

接下来的N行数据,每行有三个整数,C,M,E分别代表一个学生语文、数学和英语的成绩。

输出

一共N行,每行一个数,从大到小,分别代表各个学生的总成绩。

样本

输入

3

70 80 90

59 59 59

100 100 100

输出

300

240

177

//这个竟然是从大到小排序,改一个符号就行了。什么,为什么代码中没有出现C,M,E?只是觉得符号太多了而已。

#include<stdio.h>
int main()
{
int N,sum[100]={0},i,j,m;
scanf("%d",&N);
for(i=0;i<N;i++)
{
for(j=0;j<3;j++)
{
scanf("%d",&m);
sum[i]+=m;
}
}
for(i=0;i<N-1;i++)
{
for(j=i+1;j<N;j++)
{
if(sum[i]<sum[j])
{
sum[i]=sum[i]+sum[j];
sum[j]=sum[i]-sum[j];
sum[i]=sum[i]-sum[j];
}
}
}
for(i=0;i<N;i++)
{
printf("%d\n",sum[i]);
}
return 0;
}

P - 次大和次小

描述

对于一个数组,次大的数指数组中第二大的数,相似地,次小的数指数组中第二小的数。

给定一个含有 n 个数的数组(数组中的数互不相同),求其中次大的数和次小的数。

输入

首先输入一个整数 T (1 <= T <= 200),表示数据组数。

对于每组数据:

第 1 行输入一个整数 n (2 <= n <= 1000),表示数组中元素的数量。

第 2 行输入 n 个用空格隔开的整数 Ai (-10000 <= Ai <= 10000),表示数组中每一个元素的值。

输出

对于每组数据,输出一行,包含 2 个整数 a, b,分别表示次大和次小的数。

样本

输入

1

5

3 1 2 4 5

输出

4 2

//人外有人,天外有天,编程的学习是永无止境的,你不止需要学习C语言。

#include<stdio.h>
int main()
{
int T,n,Ai[1000],i,j;
scanf("%d",&T);
for(;T>0;T--)
{
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&Ai[i]);
}
for(i=0;i<n-1;i++)
{
for(j=i+1;j<n;j++)
{
if(Ai[i]>Ai[j])
{
Ai[i]=Ai[i]+Ai[j];
Ai[j]=Ai[i]-Ai[j];
Ai[i]=Ai[i]-Ai[j];
}
}
}
printf("%d %d\n",Ai[n-2],Ai[1]);
}
return 0;
}

Q - 冒泡排序中数据交换的次数

描述

听说过冒泡排序么?一种很暴力的排序方法。今天我们不希望你用它来排序,而是希望你能算出从小到大冒泡排序的过程中一共进行了多少次数据交换。

输入

输入数据的第一行为一个正整数 T ,表示有 T 组测试数据。

接下来T行,每行第一个整数N, 然后有N个整数,无序。0<N <= 100

输出

输出共 T 行。

每行一个整数,代表本行数据从小到大冒泡排序所进行的交换次数。

样本

输入

3

5 1 2 3 4 5

4 5 3 7 1

2 2 1

输出

0

4

1

//排序方式要都会,用一个就可以了,而不是会一个就满足。

#include<stdio.h>
int main()
{
int T,N,a[100],i,j,count;
scanf("%d",&T);
for(;T>0;T--)
{
count=0;
scanf("%d",&N);
for(i=0;i<N;i++)
{
scanf("%d",&a[i]);
}
for(i=0;i<N-1;i++)
{
for(j=0;j<N-i-1;j++)
{
if(a[j]>a[j+1])
{
count++;
a[j]=a[j]+a[j+1];
a[j+1]=a[j]-a[j+1];
a[j]=a[j]-a[j+1];
}
}
}
printf("%d\n",count);
}
return 0;
}

R - 小金追呀追不上妹子

描述

众所周知,C语言的学习是我们程序设计基础的重点和主要内容。

小金知道他喜欢的妹子最喜欢的水果是苹果,但是小金是种玉米的哪!所以他为了讨好妹子的欢心,他会从收获的n个玉米中挑选出m个最大的玉米去抠脚大汉那里换苹果,问题是,他这m个玉米的价值有多大?

输入

多组输入。

每行开始输入两个整数分别为n,m。代表含义如题目所述。

接下来一行有n个整数,代表每个玉米的价值。

1 < = m < n < = 1000

输出

输出小金m个最大玉米的总价值。

输出占一行,保证数据合法。

样本

输入

10 4

1 2 3 4 5 6 7 8 9 10

5 3

1 2 3 4 5

输出

34

12

//掌握了for循环还愿意用while循环吗?

#include<stdio.h>
int main()
{
int n,m,a[1000],i,j,sum;
for(;scanf("%d%d",&n,&m)!=EOF;)
{
sum=0;
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
for(i=0;i<n-1;i++)
{
for(j=0;j<n-i-1;j++)
{
if(a[j]>a[j+1])
{
a[j]=a[j]+a[j+1];
a[j+1]=a[j]-a[j+1];
a[j]=a[j]-a[j+1];
}
}
}
for(i=n-1;i>n-m-1;i--)
{
sum+=a[i];
}
printf("%d\n",sum);
}
return 0;
}

S - C语言实验——数组逆序

描述

有n个整数,使其最后m个数变成最前面的m个数,其他各数顺序向后移m(m < n < 100)个位置。

输入

输入数据有2行,第一行的第一个数为n,后面是n个整数,第二行整数m。

输出

按先后顺序输出n个整数。

样本

输入

5 1 2 3 4 5

2

输出

4 5 1 2 3

//常规的问题和常规的解法。

#include<stdio.h>
int main()
{
int n,m,a[100],i,j,t;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
scanf("%d",&m);
for(i=0;i<m;i++)
{
t=a[n-1];
for(j=n-1;j>0;j--)
{
a[j]=a[j-1];
}
a[j]=t;
}
for(i=0;i<n;i++)
{
printf("%d ",a[i]);
}
return 0;
}

//虽然这个比上面那个长,占用空间也多,但是运行时间可要短多了。

#include<stdio.h>
int main()
{
int n,m,a[100],b[100],i;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
scanf("%d",&m);
for(i=n-1;i>n-m-1;i--)
{
b[n-i-1]=a[i];
}
for(i=n-m-1;i>=0;i--)
{
a[i+m]=a[i];
}
for(i=0;i<m;i++)
{
a[i]=b[m-i-1];
}
for(i=0;i<n;i++)
{
printf("%d ",a[i]);
}
return 0;
}

T - 矩阵输出

描述

输入n个整数,输出由这些整数组成的n行矩阵。

输入

第一行输入一个正整数N(N<=20),表示后面要输入的整数个数。

下面依次输入N个整数。

输出

以输入的整数为基础,输出有规律的n行数据。

样本

输入

5

3 6 2 5 8

输出

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

//哦哦哦,马上就要到二维数组了,先透露一下,实验六全都是二维数组,但是数量少多了 

//还记得第一道题吗?传统的数组是不允许动态定义的,虽然现在很多编译器并不会报错。

#include<stdio.h>
int main()
{
int N,a[20],i,j,t;
scanf("%d",&N);
for(i=0;i<N;i++)
{
scanf("%d",&a[i]);
}
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
if(j==N-1)
{
printf("%d\n",a[j]);
}
else
{
printf("%d ",a[j]);
}
}
t=a[N-1];
for(j=N-1;j>0;j--)
{
a[j]=a[j-1];
}
a[0]=t;
}
return 0;
}

 

 

 

 

 

 

  • 7
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值