读书人

持续更新(3)、巩固一上C语言基础知识

发布时间: 2012-11-15 15:16:15 作者: rapoo

持续更新(3)、巩固一下C语言基础知识,顺便散分
编程解决以下问题:
在小于 10 的素数中有 3、5、7 组成的等差数列,在小于 30 的素数中有 11、17、23、 29 组成的等差数列。试找出区间[100,1000]内的素数构成的最大等差数列(即等差数列包 含的素数个数最多)并打印输出。

自己动手写代码,谁动手,谁收获!

[解决办法]
有很多种算法
[解决办法]
jf
[解决办法]
坐下先, 大清早的, 容易么我。

[解决办法]
昨天刚做的是107开始的差为30的6个数么
[解决办法]
筛法求出1000内素数,枚举所有的[prime[i],prime[j]](i<j),计算k=prime[j]-prime[i]作为等差,检测prime[j]+n*k (n>=1) 是否存在.

好苯的办法.
[解决办法]

C/C++ code
//编程解决以下问题://在小于 10 的素数中有 3、5、7 组成的等差数列,在小于 30 的素数中有 11、17、23、 29 组成的等差数列。//试找出区间[100,1000]内的素数构成的最大等差数列(即等差数列包 含的素数个数最多)并打印输出。#include <stdio.h>#include <math.h>#include <malloc.h>//判断num是不是素数,是则返回1int isPrime(int num){    int d = 3;    if(num == 2 || num == 3)        return 1;    if(num%2 == 0)//num为偶数        return 0;    //num为奇数    while(d <= sqrt(num) && num % d != 0)    {        d += 2;    }    if(num % d != 0)        return 1;    return 0;}//计算数组prime中下标从subscript开始差为d的等差数列长度int ariProgre(int *prime, int subscript, int d, int length){    int count = 1;    int i, num;    i = subscript;    while(i < length)    {        num = prime[i] + d;        while(prime[i] < num && i < length)            ++i;        if(prime[i] == num)            ++count;        else            return count;    }    return count;}int main(){    int i, j;    int maxCnt = 0, start, d, tmp;    int length = 100, sub = 0;    int *prime = (int*)malloc(sizeof(int)*length);    for(i = 100; i <= 1000; ++i)    {        if(sub == length)        {            length += 10;            prime = (int*)realloc(prime, sizeof(int)*length);        }        if(isPrime(i) == 1)        {            prime[sub++] = i;        }    }    printf("指定的数据段内的所有素数有:\n");    for(i = 0; i < sub; ++i)        printf("%d  ", prime[i]);    printf("\n");    for(i = 0; i < sub; ++i)    {        for(j = 2; j < 900; j += 2)        {            tmp = ariProgre(prime, i, j, sub);            if(maxCnt < tmp)            {                maxCnt = tmp;                start = prime[i];                d = j;            }        }    }    printf("最长的等差数列:\n");    while(maxCnt > 0)    {        printf("%d  ", start);        start += d;        --maxCnt;    }    printf("\n");    free(prime);    return 0;}/*指定的数据段内的所有素数有:2  3  5  7  11  13  17  19  23  29最长的等差数列:5  11  17  23  29指定的数据段内的所有素数有:101  103  107  109  113  127  131  137  139  149  151  157  163  167  173  179181  191  193  197  199  211  223  227  229  233  239  241  251  257  263  269271  277  281  283  293  307  311  313  317  331  337  347  349  353  359  367373  379  383  389  397  401  409  419  421  431  433  439  443  449  457  461463  467  479  487  491  499  503  509  521  523  541  547  557  563  569  571577  587  593  599  601  607  613  617  619  631  641  643  647  653  659  661673  677  683  691  701  709  719  727  733  739  743  751  757  761  769  773787  797  809  811  821  823  827  829  839  853  857  859  863  877  881  883887  907  911  919  929  937  941  947  953  967  971  977  983  991  997最长的等差数列:107  137  167  197  227  257*/ 

读书人网 >C语言

热点推荐