等差数列题目描述给一个整数数列,请判断是否为等差数列。 输入第一行是一个整数T(1≤T≤100),表示样例的个数。 每个样例第一行是一个整数N(3≤N≤10000),表示数列元素的个数。 第二行是N个整数,每个整数处于[1,1000000000]之间。 输出如果数列构成等差数列,输出"Yes";否则,输出"No"。 样例输入3 3 1 2 3 3 1 2 4 5 1 3 5 7 9 样例输出Yes No Yes | ||
原始代码如下:
#include<stdio.h>
int main()
{
int T;
scanf("%d", &T);
while (T--) {
int N;
scanf("%d", &N);
int ret = 1;
int a, b, d;
scanf("%d%d", &a, &b);
d = a - b;
N -= 2;
a = b;
while (N--) {
scanf("%d", &b);
if (a - b != d) {
ret = 0;
break;
}
a = b;
}
if (ret == 1)printf("Yes\n");
else printf("No\n");
}
return 0;
}
所遇困难:
1、输入的未必是已经有序
2、排序的算法选择,小心超时
3、预留位不可以忘记
修改后代码如下:
#include<stdio.h>
int a[10001];
void XE(int s[], int n);
int main()
{
int T;
scanf("%d", &T);
while (T--) {
int N;
scanf("%d", &N);
int i, d;
//输入元素
for (i = 1; i <= N; i++)
scanf("%d", &a[i]);
//希尔排序
XE(a, N);
//判断是否为等差
d = a[1] - a[2];
for (i = 2; i < N; i++)
if (a[i] - a[i + 1] != d)break;
if (i < N)printf("No\n");
else printf("Yes\n");
}
return 0;
}
void XE(int s[], int n)
{
int i, j, d;
d = n / 2;
while (d >= 1)
{
for (i = d + 1; i <= n; i++)
{
s[0] = s[i];
j = i - d;
while ((j > 0) && (s[0] < s[j]))
{
s[j + d] = s[j];
j = j - d;
}
s[j + d] = s[0];
}
d = d / 2;
}
}
习得知识:希尔排序