标题 等差数列及位置指示
类别 数组
时间限制 2S
内存限制 1000Kb
问题描述 请写一个程序,判断给定整数序列能否构成一个等差数列。
输入说明 输入数据由两行构成,第一行只有一个整数 n(n<100),表示序列长度(该序列中整数的 个数); 第二行为 n 个整数,每个整数互不相同,且取值区间都为[-32768~32767],整数之间以空格 间隔。
输出说明 对输入数据进行判断,若不能构成等差数列,将数列递增排序,分别输出排序后数据间的 最大差值和最小差值,数据间以空格分隔; 若能构成等差数列,将数列递增排序,并输出排序后各个数据在原数列中的对应位置(位置 计数从 1 开始)。
输入样例1
6
21 15 4 18 35 11
输出样例 1
14 3
输入样例 2 ?
5
2 6 8 4 10 ?
输出样例 2
1 4 2 3 5
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int int_cmp(const void* num1, const void* num2)
{
return (*(int*)num1 - *(int*)num2);
}
int judge(int arr[], int len)
{
int i = 0;
int d = arr[1] - arr[0];
for (i = 0; i < len - 1; i++)
{
if (arr[i + 1] - arr[i] != d)
{
return 0;
}
}
return 1;
}
int main()
{
int n = 0;
int arr[101] = { 0 };
scanf("%d", &n);
int store[101] = { 0 };
for (int i = 0; i < n; i++)
{
scanf("%d", &arr[i]);
store[i] = arr[i];
}
qsort(arr, n, sizeof(arr[0]), int_cmp);
int ret = judge(arr, n);
if (ret)
{
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
if (arr[i] == store[j])
{
printf("%d ", j + 1);
}
}
}
}
else
{
int sub[100] = { 0 };
for (int i = 0; i < n - 1; i++)
{
sub[i] = arr[i + 1] - arr[i];
}
int max = sub[0];
int min = sub[0];
for (int i = 0; i < n - 1; i++)
{
if (sub[i] > max)
{
max = sub[i];
}
if (sub[i] < min)
{
min = sub[i];
}
}
printf("%d %d", max, min);
}
return 0;
}