C趣味程序百例(09)要發(fā)就發(fā)

字號(hào):

32.要發(fā)就發(fā)
     “1898--要發(fā)就發(fā)”。請(qǐng)將不超過(guò)1993的所有素?cái)?shù)從小到大排成第一行,第二行上的每個(gè)素?cái)?shù)都等于它右肩上的素?cái)?shù)之差。編程求出:第二行數(shù)中是否存在這樣的若干個(gè)連續(xù)的整數(shù),它們的和恰好是1898?假好存在的話,又有幾種這樣的情況?
     第一行:2 3 5 7 11 13 17......1979 1987 1993
     第二行:1 2 2 4 2 4...... 8 6
    *問(wèn)題分析與算法設(shè)計(jì):
     首先從數(shù)學(xué)上分析該問(wèn)題:
     假設(shè)第一行中的素?cái)?shù)為n[1]、n[2]、n[3]....n[i]、...第二行中的差值為m[1]、m[2]、m[3]...m[j]...。其中m[j]為:
     m[j]=n[j+1]-n[j]。
    則第二行連續(xù)N個(gè)數(shù)的和為:
     SUM=m[1]+m[2]+m[3]+...+m[j]
     =(n[2]-n[1])+(n[3]-n[2])+(n[4]-n[3])+...+(n[j+1]-n[j])
     =n[j+1]-n[1]
    由此題目就變成了:在不超過(guò)1993的所有素?cái)?shù)中是否存在這樣兩個(gè)素?cái)?shù),它們的差恰好是1898。若存在,則第二行中必有所需整數(shù)序列,其和恰為1898,。
     對(duì)等價(jià)問(wèn)題的求解是比較簡(jiǎn)單的。
     由分析可知,在素?cái)?shù)序列中不必包含2,因?yàn)槿我馑財(cái)?shù)與2的差一定為奇數(shù),所以不必考慮。
    *程序與程序注釋:
    #include
    #include
    #define NUM 320
    int number[NUM]; /*存放不超過(guò)1993的全部奇數(shù)*/
    int fflag(int i);
    void main()
    {
     int i,j,count=0;
     printf("there are follwing primes sequences in first row:\n");
     for(j=0,i=3;i<=1993;i+=2) /*求出不超過(guò)1993的全部奇數(shù)*/
     if(fflag(i)) number[j++]=i;
     for(j--;number[j]>1898;j--) /*從的素?cái)?shù)開始向1898搜索*/
     {
     for(i=0;number[j]-number[i]>1898;i++); /*循環(huán)查找滿足條件的素?cái)?shù)*/
     if(number[j]-number[i]==1898) /*若兩個(gè)素?cái)?shù)的差為1898,則輸出*/
     printf("(%d).=,.....,%d\n",++count,number[i],number[j]);
     }
    }