7-1 将数组中的数逆序存放 (20分)
本题要求编写程序,将给定的n个整数存入数组中,将数组中的这n个数逆序存放,再按顺序输出数组中的元素。
输入格式:
输入在第一行中给出一个正整数n(1≤n≤10)。第二行输入n个整数,用空格分开。
输出格式:
在一行中输出这n个整数的处理结果,相邻数字中间用一个空格分开,行末不得有多余空格。
输入样例:
4 10 8 1 2
输出样例:
2 1 8 10
参考代码:
#include<stdio.h>
int main()
{
int n,i;
scanf("%d",&n);
int a[n];
for(i=0;i<n;i++)
scanf("%d",&a[i]);
for(i=n-1;i>=0;i--)
{
if(i==0)
printf("%d",a[i]);
else
printf("%d ",a[i]);
}
}
7-2 交换最小值和最大值 (15分)
本题要求编写程序,先将输入的一系列整数中的最小值与第一个数交换,然后将最大值与最后一个数交换,最后输出交换后的序列。
注意:题目保证最大和最小值都是唯一的。
输入格式:
输入在第一行中给出一个正整数N(≤10),第二行给出N个整数,数字间以空格分隔。
输出格式:
在一行中顺序输出交换后的序列,每个整数后跟一个空格。
输入样例:
5 8 2 5 1 4
输出样例:
1 2 5 4 8
参考代码:
/*本题要注意只交换头与最小植,尾与最大植,其他不变*/
#include <stdio.h>
int main()
{
int n,i,min,max,t;
scanf("%d",&n);
int a[n];min=0;max=0;
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
if(a[min]>a[i])
min=i;
}
t=a[0],a[0]=a[min],a[min]=t;
for(i=0;i<n;i++)
if(a[max]<a[i])
max=i;
t=a[n-1],a[n-1]=a[max],a[max]=t;
for(i=0;i<n;i++)
printf("%d ",a[i]);
}
7-3 简化的插入排序 (15分)
本题要求编写程序,将一个给定的整数插到原本有序的整数序列中,使结果序列仍然有序。
输入格式:
输入在第一行先给出非负整数N(<10);第二行给出N个从小到大排好顺序的整数;第三行给出一个整数X。
输出格式:
在一行内输出将X插入后仍然从小到大有序的整数序列,每个数字后面有一个空格。
输入样例:
5 1 2 4 5 7 3
输出样例:
1 2 3 4 5 7
参考代码:
#include <stdio.h>
main()
{
int n,i,j,x;
scanf("%d",&n);
int a[n+1];
for(i=0;i<n;i++)
scanf("%d",&a[i]);
scanf("%d",&x);
i=0;
while(a[i]<x&&i<n)
i++;
for (j=n-1;j>=i;j--)
a[j+1]=a[j];
a[i]=x;
for(i=0;i<n+1;i++)
printf("%d ",a[i]);
}
7-4 数组循环左移 (20分)
本题要求实现一个对数组进行循环左移的简单函数:一个数组a中存有n(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向左移m(≥0)个位置,即将a中的数据由(a0a1⋯an−1)变换为(am⋯an−1a0a1⋯am−1)(最前面的m个数循环移至最后面的m个位置)。如果还需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?
输入格式:
输入第1行给出正整数n(≤100)和整数m(≥0);第2行给出n个整数,其间以空格分隔。
输出格式:
在一行中输出循环左移m位以后的整数序列,之间用空格分隔,序列结尾不能有多余空格。
输入样例:
8 3 1 2 3 4 5 6 7 8
输出样例:
4 5 6 7 8 1 2 3
参考代码:
#include <stdio.h>
int main()
{
int m, n, i, j, temp;
scanf("%d %d", &n, &m);
int a[n];
for(i = 0; i < n; i++)
scanf("%d", &a[i]);
m = m % n; //注意移动次数尽量少
for(i = 0; i < m; ++i)
{
temp = a[0];
for(j = 0; j < n - 1; j++)
a[j] = a[j+1];
a[n - 1] = temp;
}
for(i = 0; i < n; ++i)
{
if(i)
printf(" ");
printf("%d", a[i]);
}
}