C语言判断给定整数序列是否构成等差数列
题目:
判断给定整数序列能够构成等差序列。
输入说明:
有多组数据,每组输入数据由两行构成,第一行只有一个整数n(<1000),表示序列(即序列中整数的个数,0表示输入结束),第二行为n个整数,每个整数的均为int类型。
输出说明:
对于每一组数据,输出一个yes或者no,表示该序列能否构成等差序列。
输入样本:
6
23 15 4 18 35 11
3
3 1 2
0
输出样本:
no
yes
思路分析:
本题理解起来其实不难,第一步,解决输入问题;第二步,将给定数据排序;第三步,判断序列是否为等差序列;第四步,输出结果。好,分析结束,接下来压力给到代码编写部分!
代码:
#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
int key; //0表示no,1表示yes
struct node* next;
}Linklist;
int main(void) {
int n;
int i, j;
Linklist* head, *p, *q;
//由于数据组数为动态,选用带头结点的链表存储
head = (Linklist*)malloc(sizeof(Linklist)); //分配内存
head->next = NULL;
p = head;
while(1){
scanf("%d", &n);
if(n == 0) {
p = head->next;
while(p != NULL) {
if(p->key == 0) {
printf("no\n");
}else if(p->key == 1) {
printf("yes\n");
}
p = p->next;
}
break;
}
int array[n];
//定义数据数组,输入数据
for(i = 0; i < n; i++) {
scanf("%d", &array[i]);
}
//调用函数,对数组数据进行排序
mySort(array, n);
//判断是否为等差数列
//此处用的方法为:计算前两个数的差值
//再一次将后面两数的差值与其比较看是否相等
//等,则为等差数列,否则不是
int num = array[1] - array[0];
q = (Linklist*)malloc(sizeof(Linklist));
q->next = NULL;
for(i = 1;i < n; i++) {
if((array[i] - array[i - 1]) != num) {
q->key = 0;
break; //不是等差数列,退出循环
}
}
//正常退出循环,是等差数列
if(i == n) {
q->key = 1;
}
p->next = q;
p = q;
}
return 0;
}
//排序函数
void mySort(int array[], int n) {
int i, j;
int temp;
for(i = 0; i < n - 1; i++) {
for(j = i + 1; j < n; j++) {
if(array[i] > array[j]) {
temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
}
}
运行结果:
小结:
单从代码来说,其实并没有很难的点,结构体,链表,malloc函数申请内存空间,冒泡排序,只要思路不乱代码很好理解,要注意细节的把控。