100个经典C语言程序(益智类)

100个经典C语言程序(益智类)

【1.绘制余弦曲线】

在屏幕上用“*”显示0~360度的余弦函数cos(x)曲线

[问题分析与算法设计] 利用cos(x)的左右对称性,将屏幕的行方向定义为x,列方向定义为y,则0~180度的图形与180~360度的图形是左右对称的,若定义图形的总宽度为62列,计算出x行0~180度时y点的坐标m,那么在同一行与之对称的180~360度的y点的坐标就 应为62-m。程序中利用反余弦函数acos计算坐标(x,y)的对应关系。  

#include<stdio.h>

#include<math.h>

void main(){

         double y;

         int x,m;

         for(y=1;y>=-1;y-=0.1){

                   m=acos(y)*10;

                   for(x=1;x<m;x++)

                            printf(" ");

                   printf("*");

                   for(;x<62-m;x++)

                            printf(" ");

                   printf("*");

                   printf("\n");

         }

}

 

【2.绘制余弦曲线和直线】

在屏幕上显示0~360度的cos(x)曲线与直线f(x)=45*(y-1)+31的迭加图形。其中cos(x)图形用“*”表示,f(x)用“+”表示,在两个图形相交的点上则用f(x)图形的符号。

[问题分析与算法设计] 图形迭加的关键是要在分别计算出同一行中两个图形的列方向点坐标后,正确判断相互的位置关系。为此,可以先判断图形的交点,再分别控制打印两个不同的图形。

#include<stdio.h>

#include<math.h>

void main(){

         double y;

         int x,m,n,yy;

         for(yy=0;yy<=20;yy++){

                   y=0.1*yy;

                   m=acos(1-y)*10;

                   n=45*(y-1)+31;

                   for(x=0;x<62;x++){

                            if(x==m&&x==n)

                                     printf("+");

                            else if(x==n)

                                     printf("+");

                            else if(x==m||x==62-m)

                                     printf("*");

                            else

                                     printf(" ");

                   }

                   printf("\n");

         }

}

 

【3.绘制圆】

    在屏幕上用“*”画一个空心的圆

  [算法分析与设计] 打印圆可利用图形的左右对称性。根据圆的方程:R*R=X*X+Y*Y 可以算出圆上每一点行和列的对应关系。

#include<stdio.h>

#include<math.h>

void main(){

    double y;

    int x,m;

    for(y=10;y>=-10;y--){

        m=2.5*sqrt(100-y*y);  

        for(x=1;x<30-m;x++)

                            printf(" ");   

        printf("*");                       

        for(;x<30+m;x++)

                            printf(" ");     

        printf("*\n");                             

    }

}

 

【4.歌星大奖赛】

    在歌星大奖赛中,有10个评委为参赛的选手打分,分数为1~100分。

[算法分析与设计]选手最后得分为:去掉一个最高分和一个最低分后其余8个分数的平均值。请编写一个程序实现。

#include<stdio.h>

void main(){

    int integer,i,max,min,sum;

    max=-32768;                

    min=32767;                 

    sum=0;                     

    for(i=1;i<=10;i++){

        printf("Input number %d = ",i);

        scanf("%d",&integer);        

        sum+=integer;                

        if(integer>max)

                            max=integer;  

        if(integer<min)

                            min=integer;  

    }

    printf("\nCanceled max score:%d\nCanceled min score:%d\n",max,min);

    printf("\nAverage score: %d\n",(sum-max-min)/8);   

}

 

【5.求最大数】

         问555555的约数中最大的三位数是多少?

#include<stdio.h>

void main(){

         long i;

         int j;

         printf("Please input the number: ");

         scanf("%ld",&i);

         for(j=999;j>=100;j--){

                   if(i%j==0){

                            printf("The max factor with 3 digits in %ld is: %d\n",i,j);

                            break;

                   }

         }

}

 

【6.高次方数的尾数】

         求13的13次方的最后三位数

  [算法设计与分析]研究乘法的规律发现:乘积的最后三位的值只与乘数和被乘数的后三位有关,与乘数和被乘数的高位无关。

#include<stdio.h>

void main(){

    int i,x,y,last=1;  

    printf("Input X and Y(X**Y):");

    scanf("%d**%d",&x,&y);

    for(i=1;i<=y;i++)              

        last=last*x%1000;   

    printf("The last 3 digits of %d**%d is:%d\n",x,y,last%1000);

}

 

【7. 分数四则运算】

    对输入的两个分数进行+、-、*、/四则运算,输出分数结果。

#include<stdio.h>

void main(){

    long int a,b,c,d,i,x,y,z;

    char op;

    printf("两分数b/a,d/c作+,-,*,/四则运算,结果为分数。\n");

    printf("请输入分数运算式。\n");

    scanf("%ld/%ld%c%ld/%ld",&b,&a,&op,&d,&c);

    if(a==0||c==0) {

                   printf("分母为0输入错误!");

         }

    if(op=='+') {

                   y=b*c+d*a;

                   x=a*c;

         }      

    if(op=='-') {

                   y=b*c-d*a;

                   x=a*c;

         }

    if(op=='*') {

                   y=b*d;

                   x=a*c;

         }

    if(op=='/') {

                   y=b/c;

                   x=a/d;

         }

    z=x;

    if(x>y)

                   z=y;

    i=z;

    while(i>1) {

        if(x%i==0&&y%i==0){

                            x=x/i;

                            y=y/i;

                            continue;

                   }

        i--;

    }

    printf("%ld/%ld%c%ld/%ld=%ld/%ld.\n",b,a,op,d,c,y,x);

 

}

 

【8.借书方案知多少】

    小明有五本新书,要借给A,B,C三位小朋友,若每人每次只能借一本,则可以有多少种不同的借法?

#include<stdio.h>

void main(){

    int a,b,c,count=0;

    printf("There are diffrent methods for XM to distribute books to 3 readers:\n");

    for(a=1;a<=5;a++)           

        for(b=1;b<=5;b++)       

            for(c=1;c<=5;c++)  

                if(a!=b&&c!=a&&c!=b)      

                    printf(count%8?"%2d:%d,%d,%d ":"%2d:%d,%d,%d  \n",++count,a,b,c);

}

 

【9.杨辉三角形】

    在屏幕上显示杨辉三角形

                            1

 

                         1      1

 

                      1     2      1

 

                   1     3     3      1

 

               1      4     6      4     1

 

            1     5     10     10     5     1

#include<stdio.h>

int c(int x,int y){

    int z;

    if((y==1)||(y==x+1))

                   return 1;

    z=c(x-1,y-1)+c(x-1,y);        

    return z;

}

void main(){

    int i,j,n=13;

    printf("N=");

    while(n>12)

        scanf("%d",&n);   

    for(i=0;i<=n;i++){

        for(j=0;j<24-2*i;j++)

                            printf(" ");

        for(j=1;j<i+2;j++)

                            printf("%4d",c(i,j));  

        printf("\n");

    }

}

 

【10.数制转换】

    将任一整数转换为二进制形式

#include<stdio.h>

void printb(int x,int n){

    if(n>0){

        putchar(\'0\'+((unsigned)(x&(1<<(n-1)))>>(n-1)));

        printb(x,n-1);    

    }

}

 

void main(){

    int x;printf("Input number:");

    scanf("%d",&x);

    printf("number of decimal form:%d\n",x);

    printf("      it\'s binary form:");

    printb(x,sizeof(int)*8);

    putchar(\'\n\');

}

 

【11.打鱼还是晒网】

   中国有句俗语叫“三天打鱼两天晒网”。某人从1990年1月1日起开始“三天打鱼两天晒网”,问这个人在以后的某一天中是“打鱼”还是“晒网”。

#include<stdio.h>

struct date{

         int year;

         int month;

         int day;

};

 

int days(struct date day){        

         static int day_tab[2][13]=

{ {0,31,28,31,30,31,30,31,31,30,31,30,31}, {0,31,29,31,30,31,30,31,31,30,31,30,31}};

         int i,lp;

         lp=(day.year%4==0)&&(day.year%100!=0)||(day.year%400==0);  //判定year为闰年还是平年,lp=0为平年,非0为闰年

    for(i=1;i<day.month;i++){                   //计算本年中自1月1日起的天数

                   if(lp=0)

                            day.day+=day_tab[0][13];

                   else

                            day.day+=day_tab[1][13];

         }

         return day.day;

}

 

void main(){

         struct date today,term;

         int yearday,year,day;

         printf("Enter year/month/day:");

         scanf("%d%d%d",&today.year,&today.month,&today.day);  /*输入日期*/

         term.month=12;               /*设置变量的初始值:月*/

         term.day=31;                 /*设置变量的初始值:日*/

         for(yearday=0,year=1990;year<today.year;year++){

                   term.year=year;

                   yearday+=days(term);     /*计算从1990年至指定年的前一年共有多少天*/

         }

         yearday+=days(today);       /*加上指定年中到指定日期的天数*/

         day=yearday%5;               /*求余数*/

         if(day>0&&day<4)

                   printf("he was fishing at that day.\n");   /*打印结果*/

         else

                   printf("He was sleeping at that day.\n");

}

 

【12.抓交通肇事犯】

   一辆卡车违反交通规则,撞人后逃跑。现场有三人目击事件,但都没有记住车号,只记下车号的一些特征。甲说:牌照的前两位数字是相同的;乙说:牌照的后两位数字是相同的,但与前两位不同;丙是数学家,他说:四位的车号刚好是一个整数的平方。请根据以上线索求出车号。

#include<stdio.h>

void main(){

         int i,j,k;

         int num;

         for(i=0;i<=9;i++){               //车号前两位的取值

                   for(j=0;j<=9;j++){      //车号后两位的取值

                            if(i!=j){                //前两位和后两位不同

                                     num=i*1000+i*100+j*10+j;

                                     for(k=1;k*k<num;k++);

                                     if(k*k==num)

                                               printf("Lorry--No. is %d \n",num);

                            }

                   }

         }

}

 

【13.该存多少钱】

    假设银行一年整存零取的月息为0.63%。现在某人手中有一笔钱,他打算在今后的五年中的年底取出1000元,到第五年时刚好取完,请算出他存钱时应存入多少。

#include<stdio.h>

void main(){

    int i;

    float total=0;

    for(i=0;i<5;i++)                   

        total=(total+1000)/(1+0.0063*12);

    printf("He must save %.2f at first.\n",total);

}

 

【14.怎样存钱利最大】

假设银行整存整取存款不同期限的月息利率分别为:

            0.63%     期限=1年

            0.66%     期限=2年

            0.69%     期限=3年

            0.75%     期限=5年

            0.84%     期限=8年

利息=本金*月息利率*12*存款年限。

现在某人手中有2000元钱,请通过计算选择一种存钱方案,使得钱存入银行20年后得到的利息最多(假定银行对超过存款期限的那一部分时间不付利息)。

#include<stdio.h>

#include<math.h>

void main(){

         int i8,i5,i3,i2,i1,n8,n5,n3,n2,n1;

         float max=0,term;

    for(i8=0;i8<3;i8++)       /*穷举所有可能的存款方式*/

                   for(i5=0;i5<=(20-8*i8)/5;i5++)

                            for(i3=0;i3<=(20-8*i8-5*i5)/3;i3++)

                                     for(i2=0;i2<=(20-8*i8-5*i5-3*i3)/2;i2++){

                                               i1=20-8*i8-5*i5-3*i3-2*i2;

                                               term=2000.0*pow((double)(1+0.0063*12),

                                                                                    (double)i1)*pow((double)(1+2*0.0063*12),

                                                                                    (double)i2)*pow((double)(1+3*0.0069*12),

                                                                                    (double)i3)*pow((double)(1+5*0.0075*12),

                                                                                    (double)i5)*pow((double)(1+8*0.0084*12),

                                                                                    (double)i8);

                                                /*计算到期时的本利合计*/

                                               if(term>max){

                                                        max=term;

                                                        n1=i1;

                                                        n2=i2;

                                                        n3=i3;

                                                        n5=i5;

                                                        n8=i8;

                                               }

                            }

         printf("For max profit,he should save his money in a bank:\n");

         printf("   made fixed deposit for 8 year: %d times\n",n8);

         printf("   made fixed deposit for 5 year: %d times\n",n5);

         printf("   made fixed deposit for 3 year: %d times\n",n3);

         printf("   made fixed deposit for 2 year: %d times\n",n2);

         printf("   made fixed deposit for 1 year: %d times\n",n1);

         printf("        Toal: %.2f\n",max);

}

 

【15.捕鱼和分鱼】

  A、B、C、D、E五个人在某天夜里合伙去捕鱼,到第二天凌晨时都疲惫不堪,于是各自找地方睡觉。日上三杆,A第一个醒来,他将鱼分为五份,把多余的一条鱼扔掉,拿走自己的一份。B第二个醒来,也将鱼分为五份,把多余的一条鱼扔掉,保持走自己的一份。C、D、E依次醒来,也按同样的方法拿 走鱼。问他们合伙至少捕了多少条鱼?

#include<stdio.h>

void main(){

    int n,i,x,flag=1;        

    for(n=6;flag;n++){

        for(x=n,i=1&&flag;i<=5;i++)

            if((x-1)%5==0)  x=4*(x-1)/5;

            else   flag=0;            

        if(flag)  break;            

        else  flag=1;                

    }

    printf("Total number of fish catched=%d\n",n);

}

 

【16.出售金鱼】

    买卖提将养的一缸金鱼分五次出售,系统上一次卖出全部的一半加二分之一条;第二次卖出余下的三分之一加三分之一条;第三次卖出余下的四分之一加四分之一条;第四次卖出余下的五分之一加五分之一条;最后卖出余下的11条。问原来的鱼缸中共有几条金鱼?

#include<stdio.h>

void main(){

    int i,j,n=0,x;                   

    for(i=23;n==0;i+=2) {

        for(j=1,x=i;j<=4&&x>=11;j++)

            if((x+1)%(j+1)==0)      

                x-=(x+1)/(j+1);

            else {

                                     x=0;

break;

                            }       

        if(j==5&&x==11) {

            printf("There are %d fishes at first.\n",i);        

            n=1;                                        

        }

    }

}

 

【17.平分七筐鱼】

  甲、乙、丙三位鱼夫出海打鱼,他们随船带了21只箩筐。当晚返航时,他们发现有七筐装满了鱼,还有七筐装了半筐鱼,另外七筐则是空的,由于他们没有秤,只好通过目测认为七个满筐鱼的重量是相等的,7个半筐鱼的重量是相等的。在不将鱼倒出来的前提下,怎样将鱼和筐平分为三份?

#include<stdio.h>

int a[3][3],count;

void main(){

    int i,j,k,m,n,flag;

    printf("It exists possible distribtion plans:\n");

    for(i=0;i<=3;i++) {

        a[0][0]=i;

        for(j=i;j<=7-i&&j<=3;j++) {

            a[1][0]=j;

            if((a[2][0]=7-j-a[0][0])>3) continue;   

            if(a[2][0]<a[1][0]) break;  

            for(k=1;k<=5;k+=2) {

                a[0][1]=k;

                for(m=1;m<7-k;m+=2) {

                    a[1][1]=m;

                    a[2][1]=7-k-m;

                    for(flag=1,n=0;flag&&n<3;n++)

                        if(a[n][0]+a[n][1]<7&&a[n][0]*2+a[n][1]==7)

                            a[n][2]=7-a[n][0]-a[n][1];    

                        else  

flag=0;                      

                    if(flag){

                        printf("No.%d   Full basket Semi--basket Empty\n",++count);

                        for(n=0;n<3;n++)

                        printf("fisher %c:    %d    %d    %d\n", 'A'+n,a[n][0],a[n][1],a[n][2]);

                    }

                }

            }

        }       

}       

}

 

【18.有限5位数】

    个位数为6且能被3整除的五位数共有多少?

#include<stdio.h>

void main(){

    long int i;

    int count=0;             

    for(i=1000;i<9999;i++)

        if(!((i*10+6)%3))    

            count++;         

        printf("count=%d\n",count);

}

 

【19. 8 除不尽的数】

    一个自然数被8除余1,所得的商被8除也余1,再将第二次的商被8除后余7,最后得到一个商为a。

         又知这个自然数被17除余4,所得的商被17除余15,最后得到一个商是a的2倍。求这个自然数。

#include<stdio.h>

void main(){

    int i;

    for(i=0;;i++)               

        if(((i*8+7)*8+1)*8+1==(34*i+15)*17+4) {                                   

            printf("The required number is: %d\n",(34*i+15)*17+4);

            break;          

        }

}

 

【20.一个奇异的三位数】

    一个自然数的七进制表达式是一个三位数,而这个自然数的九进制表示也是一个三位数,且这两个三位数的数码正好相反,求这个三位数。

[题目分析与算法设计]根据题意可知,七进制和九进制表示的这全自然数的每一位一定小于7,可设其七进制数形式为kji(i、j、k的取值分别为1~6),然后设其九进制表示形式为ijk。

#include<stdio.h>

void main(){

         int i,j,k;

         for(i=1;i<7;i++)

                   for(j=0;j<7;j++)

                            for(k=1;k<7;k++)

                                     if(i*9*9+j*9+k==i+j*7+k*7*7){

                                               printf("The special number with 3 digits is: ");

                                               printf("%d%d%d(7)=%d%d%d(9)=%d(10)\n",k,j,i,i,j,k,i*9*9+j*9+k);

                                     }

}

 

【21.4位反序数】

   设N是一个四位数,它的9倍恰好是其反序数,求N。反序数就是将整数的数字倒过来形成的整数。例如:1234的反序数是4321。

#include<stdio.h>

void main(){

    int i;

    for(i=1002;i<1111;i++)      

        if(i%10*1000+i/10%10*100+i/100%10*10+i/1000==i*9)

            printf("The number satisfied stats condition is: %d\n",i);

}

 

【22.求车速】

  一辆以固定速度行驶的汽车,司机在上午10点看到里程表上的读数是一个对称数(即这个数从左向右读和从右向左读是完全一样的),为95859。两小时后里程表上出现了一个新的对称数。问该车的速度是多少?新的对称数是多少?

 [算法分析与设计]设所求对称数为i,其初值为95589,对其依次递增取值,将i值的每一位分解后与其对称位置上的数进行比较,若每个对称位置上的数皆相等,则可判定i即为所求的对称数。

#include<stdio.h>

void main(){

    int t,a[5];          

    long int k,i;

    for(i=95860;;i++) {

        for(t=0,k=100000;k>=10;t++) {                             

            a[t]=(i%k)/(k/10);       

            k/=10;

        }

        if((a[0]==a[4])&&(a[1]==a[3])){

            printf("The new symmetrical number kelometers is: %d%d%d%d%d\n", a[0],a[1],a[2],a[3],a[4]);

            printf("The velocity of the car is: %.2f\n",(i-95859)/2.0);

            break;

        }

    }

}

 

【23.阿姆斯特朗数】

 如果一个正整数等于其各个数字的立方和,则称该数为阿姆斯特朗数(亦称为自恋性数)。

如 407=4^3+0^3+7^3就是一个阿姆斯特朗数。试编程求1000以内的所有阿姆斯特朗数。

#include<stdio.h>

void main(){

    int i,t,k,a[3];

    printf("There are follwing Armstrong number smaller than 1000:\n");

    for(i=2;i<1000;i++) {

        for(t=0,k=1000;k>=10;t++) {

            a[t]=(i%k)/(k/10);      

            k/=10;

        }

        if(a[0]*a[0]*a[0]+a[1]*a[1]*a[1]+a[2]*a[2]*a[2]==i)

            printf("%5d",i);          

    }

    printf("\n");

}

 

【24.完全数】

    如果一个数恰好等于它的因子之和,则称该数为“完全数”。

#include<stdio.h>

void main(){

    int a,i,m;

    printf("There are following perfect numbers smaller than 1000: \n");

    for(a=1;a<1000;a++) {

        for(m=0,i=1;i<=a/2;i++) 

            if(!(a%i))

                                     m+=i;

        if(m==a)

            printf("%4d",a);

    }

    printf("\n");

}

 

【26.亲密数】

 如果整数A的全部因子(包括1,不包括A本身)之和等于B;且整数B的全部因子(包括1,不包括B本身)之和等于A,则将整数A和B称为亲密数。求3000以内的全部亲密数。

#include<stdio.h>

void main(){

    int a,i,b,n;

    printf("There are following friendly--numbers pair smaller than 3000:\n");

    for(a=1;a<3000;a++) {      

        for(b=0,i=1;i<=a/2;i++)  

            if(!(a%i))

                                     b+=i;      

        for(n=0,i=1;i<=b/2;i++)

            if(!(b%i))

                                     n+=i;

        if(n==a&&a<b)

            printf("%4d..%4d    ",a,b);

    }

         printf("\n");

}

 

【27.自守数】

  自守数是指一个数的平方的尾数等于该数自身的自然数。请求出200000以内的自守数

#include<stdio.h>

void main(){

    long mul,number,k,ll,kk;

    printf("It exists following automorphic nmbers small than 200000:\n");

    for(number=0;number<200000;number++)

    {

        for(mul=number,k=1;(mul/=10)>0;k*=10);

        kk=k*10;    

        mul=0;      

        ll=10;      

        while(k>0) {

            mul=(mul+(number%(k*10))*(number%ll-number%(ll/10)))%kk;

            k/=10;             

            ll*=10;

        }

        if(number==mul)       

            printf("%ld   ",number);

    }

         printf("\n");

}

 

【28.回文数】

    打印所有不超过n (取n<256) 的其平方具有对称性质的数(也称回文数)。

#include<stdio.h>

void main(){

    int m[16],n,i,t,count=0;

    long unsigned a,k;

    printf("No.    number     it's square(palindrome)\n");

    for(n=1;n<256;n++) {

        k=0;t=1;a=n*n;          

        for(i=1;a!=0;i++){

            m[i] = a%10;

            a/=10;

        }

    for(;i>1;i--){

        k+=m[i-1]*t;

        t*=10;

    }

    if(k==n*n)

        printf("%2d%10d%10d\n",++count,n,n*n);

   }

}

 

【29.求具有abcd=(ab+cd)^2性质的四位数】

 3025这个数具有一种独特的性质:将它平分为二段,即30和25,使之相加后求平方,

即(30+25)2,恰好等于3025本身。请求出具有这样性质的全部四位数。

#include<stdio.h>

void main(){

    int n,a,b;

    printf("There are following number with 4 digits satisfied condition\n");

    for(n=1000;n<10000;n++) {

        a=n/100;                      

        b=n%100;                      

        if((a+b)*(a+b)==n)    

            printf(" %d  ",n);

    }

         printf("\n");

}

 

【30.求素数】

    求素数表中1~1000之间的所有素数

#include<stdio.h>

void main(){

    int n1,nm,i,j,flag,count=0;

    do{

        printf("Input START and END=?");

        scanf("%d%d",&n1,&nm);         

    }while(!(n1>0&&n1<nm));             

    printf("...........PRIME TABLE(%d--%d)............\n",n1,nm);

    if(n1==1||n1==2){

        printf("%4d",2);

        n1=3;

                   count++;

    }

    for(i=n1;i<=nm;i++) {

        if(!(i%2))

                            continue;

        for(flag=1,j=3;flag&&j<i/2;j+=2)

            if(!(i%j))

                                     flag=0;     

        if(flag)

                            printf(++count%15?"%4d":"%4d\n",i);

    }

         printf("\n");

}

 

【31.歌德巴赫猜想】

验证:2000以内的正偶数都能够分解为两个素数之和(即验证歌德巴赫猜想对2000以内的正偶数成立。

#include<stdio.h>

#include<math.h>

int fflag(int i) {

    int j;

    if(i<=1)  return 0;

    if(i==2)  return 1;

    if(!(i%2))  return 0;   

    for(j=3;j<=(int)(sqrt((double)i)+1);j+=2)

        if(!(i%j))  return 0;

    return 1;             

}

 

void main(){

    int i,n;

    for(i=4;i<=2000;i+=2){

        for(n=2;n<i;n++)       

            if(fflag(n))       

                if(fflag(i-n)) {

                    printf("%14d=%d+%d\n",i,n,i-n);      

                    break;

                }

            if(n==i) 

                                     printf("error %d\n",i);

    }

}

 

【32.要发就发】

“1898--要发就发”。请将不超过1993的所有素数从小到大排成第一行,第二行上的每个素数都等于它右肩上的素数之差。编程求出:第二行数中是否存在这样的若干个连续的整数,它们的和恰好是1898?假好存在的话,又有几种这样的情况?

    第一行:2  3  5  7  11  13  17......1979  1987  1993

    第二行:1  2  2  4  2  4......         8     6

#include<stdio.h>

#include<math.h>

#define NUM 320

int number[NUM];   //存放不超过1993的全部素数

int fun(int i){

    int j;

    if(i<=1) return 0;   //判断是否为素数,为1是素数,为0不是素数

    if(i==2) return 1;

    if(!(i%2)) return 0;             

    for(j=3;j<=(int)(sqrt((double)i)+1);j+=2)

        if(!(i%j)) return 0;

    return 1;

}

void main(){

         int i,j,count=0;

         printf("There are following primes sequesces in first row: \n");    //列出第一行中差值为1989的所有素数组合

         for(j=0,i=3;i<=1993;i+=2){                                              //求出不超过1993的全部素数

                   if(fun(i))

                            number[j++]=i;

         }

         for(j--;number[j]>1898;j--){                                   //从最大的素数开始向1898搜索

                   for(i=0;number[j]-number[i]>1898;i++);           //循环查找满足条件的素数

                   if(number[j]-number[i]==1898)                                    //若两个素数的差为1898,则输出

                            printf("(%d).%3d,.....,%d\n",++count,number[i],number[j]);

         }

}

 

/*

    There are follwing primes sequences in first row:

    (1).89,......,1987

    (2).53,......,1951

    (3). 3,......,1901

 */

 

【35.素数幻方】

求四阶的素数幻方。即在一个4X4 的矩阵中,每一个格填 入一个数字,使每一行、每一列和两条对角线上的4 个数字所组成的四位数,均为可逆素数。

#include<stdio.h>

#include<math.h>

int number[210][5];   

int select[110];             

int array[4][5];      

int count;            

int selecount;        

int larray[2][200];   

int lcount[2];

int num(int number);

int ok(int number);

void process(int i);

void copy_num(int i);

int comp_num(int n);

int find1(int i);

int find2(void);

int find0(int num);

void p_array(void);

 

void main(){

    int i,k,flag,cc=0,i1,i4;

    printf("there are magic squares with invertable primes as follw:\n");

    for(i=1001;i<9999;i+=2){                             //求满足条件的可逆素数

        k=i/1000;

        if(k%2!=0&&k!=5&&num(i)){                     //若可逆素数的第一位不是偶数或5

            number[count][0]=i;                                     //存入数组

            process(count++);                               //分解素数的各位数字

            if(number[count-1][2]%2!=0&&      //若可逆素数满足放在矩阵第一行

               number[count-1][3]%2!=0&&   //和最后一行的条件,记录可逆素数的

               number[count-1][2]!=5&&                  //下标,计数器加1

               number[count-1][3]!=5)

                select[selecount++]=count-1;

        }

    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值