C语言—中级 寻找等差数列
代码如下:
/************************************************************************
* 文件名:sequence
* 文件功能描述:寻找等差数列
* 文件作者名:Mr_han QQ:785937095
* 说明:
* 1、输入参数:m 给定的区间下限;n 给定的区间上限
* 2、在给定的区间范围内找出所有素数能构成的最大的等差数列
**************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LONG long
/*从素数中寻找最长的等差数列*/
void Arithmetic(LONG arry[], LONG n)
{
LONG i, j, k, temp, len ,a , d;
temp = len = 0;
for ( i = 0; i < n; i++ ) /*轮询等差数列的第一项*/
{
for ( j = i+1; j < n; j++ ) /*轮询等差数列的第二项*/
{
LONG delta = arry[j] - arry[i];
len = 2;
LONG tmp = arry[j];
for ( k = j + 1; k < n; k++ ) /*轮询寻找符合该等差数列的其他项*/
{
if ( delta == arry[k] - tmp )
{
len++; /*并记录长度*/
tmp = arry[k];
}
}
if ( temp < len ) /*判断是否为最长*/
{
k--;
temp = len; /*记录最长等差数列的项数*/
a = arry[i]; /*记录首项*/
d = delta; /*记录等差*/
}
}
}
while ( temp-- ) /*输出该等差数列*/
{
printf ( "%d ", a );
a = a + d;
}
return;
}
/*将区间内的素数找出,并放入新的数组中*/
LONG* Pnumber(LONG arry[], LONG* n)
{
LONG i, j, m, o;
o = 0;
LONG *num = ( LONG * ) malloc ((*n)*sizeof ( LONG ) ); /*为指针开辟空间*/
for ( i = 0; i < *n; i++ )
{
m = 0;
for ( j = 1; j <= arry[i]; j++ ) /*从1开始取余,算出取余为0的个数*/
{
if ( 0 == arry[i]%j )
{
m++;
}
}
if ( 2 == m ) /*若有两个,则为素数*/
{
num[o] = arry[i];
o++;
}
}
*n = o; /*记录数组的长度*/
return num;
}
void main()
{
LONG a, b, n;
printf ( "请输入区间的起点和终点并用空格隔开:" );
scanf ("%d %d", &a, &b);
n = b - a + 1;
LONG arry[n]; /*定义数组的大小*/
LONG i;
for ( i = 0; i < n; i++ )
{
arry[i] = a++; /*给数组赋值*/
}
LONG *p = Pnumber ( arry, &n ); /*新建一个指针接受新的数组*/
Arithmetic ( p, n );
return;
}