描述
给出一个有序数列随机旋转之后的数列,如原有序数列为:[0,1,2,4,5,6,7] ,旋转之后为[4,5,6,7,0,1,2]。 假定数列中无重复元素,且数列长度为奇数。 求出旋转数列的中间值。如数列[4,5,6,7,0,1,2]的中间值为4。
输入
4,5,6,7,0,1,2
输出
4
输入样例
1
1,2,3
4,5,6,7,0,1,2
12,13,14,5,6,7,8,9,10
输出样例
1
2
4
9
代码:
例1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stddef.h>
#include <ctype.h>
int main()
{
int a[1000],d[1000];
int count=0;
int i,j,max,maxj;
while(scanf("%d,",&a[count++])); //while在条件满足时执行循环
//将输入赋值到数组a[]中,scanf()函数返回的值的意义为:正确按指定格式输入变量的个数
count--;
for(i=0;i<=count/2;i++)
{
max=0;
for(j=0;j<count;j++)
{
if(a[j]>max)
{
max=a[j];
maxj=j;
}
}
d[i]=max;a[maxj]=0;
}
printf("%d\n",d[count/2]);
}
例2
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stddef.h>
#include <ctype.h>
int main()
{
int i[1000],n,m,temp,l = 0;
char c;
scanf("%d",i); //i变量本身就是数组的首地址,所以不加&
c = getchar();
while(c == ',')
{
scanf("%d",&i[++l]);
c = getchar();
}
for(n=0;n<=l;n++) //以下为排序然后取中间值
{
for(m=n;m<=l;m++)
{
if(i[n]>i[m])
{
temp = i[m];
i[m] = i[n];
i[n] = temp;
}
}
}
printf("%d\n",i[l/2]);
return 0;
}
心得:
- scanf(“输入控制符”, 输入参数);
# include <stdio.h>
int main(void)
{
int a[100];
int i;
scanf("%d%d", &i,a); //&i 表示变量 i 的地址,&是取地址符 i本身就是数组的首地址,则不用加&
printf("i = %d\n", i);
return 0;
}
- 可以改进的方法:
输入的数字个数未知,所以无法确定数组大小,可以先给数组分配一定的大小,当不够用时,再扩大分配空间。输入的数字个数未知,所以无法确定数组大小,可以先给数组分配一定的大小,当不够用时,再扩大分配空间。
此时就用到了动态内存。使用动态内存很明显的好处就是:不需要预先分配存储空间且分配的空间可以根据程序的需要扩大或缩小,这样可以有效的使用内存空间。