C语言—中级 寻找等差数列

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;
}