算法在数学中应用1

计算两个正整数得最大公约数和最公倍数

#include<stdio.h>
int gcd(int a,int b) //最大公约数
{
  int min;
  if(a<=0||b<=0)   //是负数就退出程序
   return -1;
  if(a>b)
   min=b;    //将a,b中较小的赋值给min
  else
   min=a;
  while(min){
     if(a%min==0&&b%min==0)   //判断是否是公约数
	     return min;         //找到最大公约数返回此值
		 min--;    //不是最大公约数,缩小min
  }
  return -1;
}

int lcm(int a,int b)   //最小公倍数
{
  int max;
  if(a<=0||b<=0)  //是负数就退出程序
     return -1;
  if(a>b)    //将a,b中较大的赋值给max
    max=a;
  else 
    max=b;
  while(max){
      if(max%a==0&&max%b==0)  //判断是否是公倍数
	    return max;  //找到最小公倍数数返回此值
	    max++;
  }
  return -1;
}

int main()
{
   int a,b;
   printf("请输入两个正整数可以得到最大公约数和最小公倍数\n");
   scanf("%d%d",&a,&b);
   printf("\n%d和%d的最大公约数是:%d",a,b,gcd(a,b));
   printf("\n%d和%d的最小公倍数是:%d\n",a,b,lcm(a,b));
   return 0;
}

哥德巴赫猜想的近似证明

#include <string.h>   
#include <stdio.h>   
int isGoldbach(int a);  
int TestifyGB_Guess(int low,int high);  
int isPrime(int i);  
void main()  
{  
        /*验证1~100以内的歌德巴赫猜想*/ 
    printf("\n验证1~100以内的歌德巴赫猜想\n");  
     if(TestifyGB_Guess(1,100))  
       printf("\n1~100以内的歌德巴赫猜想是正确的\n"); 
        else  printf("\n歌德巴赫猜想是错误的\n"); 
        getchar();  
        }  
    int TestifyGB_Guess (int low,int high)  
        {/*在low和high的范围内验证歌德巴赫猜想*/  
        int i,j=0;  
        int flag=0; 
            for(i=low;i<=high;i++)  
             if(i%2==0&&i>2)  
                if(isGoldbach(i)){  /*偶数i符合歌德巴赫猜想*/ 
                     j++;                    /*j用来控制输出格式*/  
            if(j==5){ 
                      printf("\n");  
                   j=0;  
                      }  
                    }  
                    else  
                    {flag=1;break;}  
                      if(flag==0) 
                       return 1;               /*在low和high的范围内歌德巴赫猜想正确返回1*/ 
                       else  
                       return 0;               /*在low和high的范围内歌德巴赫猜想不正确返回0*/  
        }   
    int isGoldbach(int a) 
           {/*判断偶数a是否符合歌德巴和猜想*/ 
            int i,flag=0;  
             for(i=1;i<=a/2;i++)  
              {  
        if(isPrime(i)&& isPrime(a-i))  
         /*如果i和a-i都为素数,则符合歌氏猜想*/  
           {  
         flag=1;  
          printf("%d=%d+%d ",a,i,a-i); 
           break; 
                 } 
            }  
             if(flag==1)  
              return 1;               /*a符合歌德巴赫猜想返回1*/  
                else  
                 return 0;           /*a不符合歌德巴赫猜想返回0*/  
                }               
               int isPrime(int i)
                {/*判断o是否是素数*/ 
                 int n,flag=1; 
                 if(1==i)flag=0;     /*1不是素数,素数都要大于1*/  
                  for(n=2;n<i;n++) 
                     if(i%n==0){flag=0;break;} 
                   /*如果在2~i-1之间i有其他因子,则i不是素数,flag置0*/  
                    if(flag==1)  
                      return 1;           /*i是素数返回1*/ 
                       else  
                       return 0;       /*i不是素返回0*/  
                       } 

有红,黄,绿三种颜色的球,其中红球3个,黄球3个,绿球6个。现在将这12个球混
放在一个盒子中,从中任意摸出8个球,编程计算摸出球的各种颜色搭配

#include<stdio.h>
void main()
{
  int red,yellow,green;
  printf("红球\t黄球\t绿球\t\n");
  for(red=0;red<=3;red++){
     for(yellow=0;yellow<=3;yellow++){
	    for(green=2;green<=6;green++){
		   if(red+yellow+green==8){
		     printf(" %d\t %d\t %d\t\n",red,yellow,green);
		   }
		}
	 }
  }
}

百钱买百鸡

#include<stdio.h>
void main()
{
  int i,j,k;
  printf("百钱买百鸡的方法列表:\n");
  for(i=0;i<=100;i++){
     for(j=0;j<=100;j++){
	   for(k=0;k<=100;k++){
	      if(5*i+3*j+k/3==100&&k%3==0&&i+j+k==100){
		     printf("公鸡:%d\t母鸡:%d\t小鸡:%d\t\n",i,j,k);
		  }
	   }
	 }
  }
}

完全数

#include<stdio.h>
void main()
{
  long p[300];             //保存分解的因子
  long i,num,count,s,c=0;
  for(num=2;num<=2000000;num++){
  count=0;
  s=num;
  for(i=1;i<num/2+1;i++){    //循环处理每一个数
    if(num%i==0){      //能被i整除
	    p[count++]=i;        //保存因子,计数器count增加1
		s-=i;                //减去一个因子
	}
  }
    if(s==0){
  printf("%4ld是完全数,因子是",num);
  printf("  %ld=%ld",num,p[0]);  //输出完全数
  for(i=1;i<count;i++){   //输出因子
      printf("+%ld",p[i]);
  }
  printf("\n");
  c++;
  }
  }
  getchar();
}

亲密数

如果整数A的全部因子之和等于B,此处的因子包括1,但是不包括A本身,并且整数B的全部因子(包括1,不包括本身)之和等于A,则将整数A和B称为亲密数 

按照亲密数的定义,想要判断数a是否有亲密数,需要先计算出a的全部因子的累加和为b,然后再计算b的全部因子的累加和为n。如果n等于a,则可以判定a和b是亲密数。

计算数a的各因子算法如下:

用a依次对i(i=1~a/2)进行模运算,如果模运算结果等于0,则i为a 的一个因子;否则i就不是a 的因子

#include<stdio.h>
void main()
{
  int i,a,b1,b2,m,g1[100],g2[100],count;
  printf("输入最大范围:");
  scanf("%d",&m);
  for(a=1;a<m;a++){       //循环次数
    for(i=0;i<100;i++){       
	   g1[i]=g2[i]=0;    //清空数组
	   }
	   count=0;                //数组下标
	   b1=0;                   //累加求和
	   for(i=1;i<a/2+1;i++){        //求数a的因子
	      if(a%i==0){               //a能被i整除
		     g1[count++]=i;            //保存因子到数组
			 b1+=i;                 //累加因子之和
		  }
	   }
	count=0;
	b2=0;
	for(i=1;i<b1/2+1;i++){       //将数a因子之和再进行因子分解
	   if(b1%i==0){    //b1能被i整除
	     g2[count++]=i;      //保存因子到数组
		 b2=b2+i;     //累加因子之和
	   }
	}
	if(b2==a&&a<b1){  //判断A,B的输出条件
       printf("\n\n%d和%d是亲密数,各因子为:",a,b1); //输出亲密数
       printf("\n%d=1",a);
       count=1;
       while(g1[count]>0){   //输出一个数的因子
	        printf("+%d",g1[count]);
			count++;
	   }
       printf("\n%d=1",b1);
       count=1;
       while(g2[count]>0){    //输出另一个数的因子
	   printf("+%d",g2[count]);
	   count++;
	   }	   
	}
	}
	printf("\n");
  }

水仙花数

#include<stdio.h>
#include<math.h>
int main()
{
  int i,j,k,c;
  printf("100~999的水仙花数:\n");
  for(c=100;c<=999;c++){
    i=c/100;              //分解百位数
	j=(c-i*100)/10;   //分解十位数
	k=c%10;          //分解个位数
	if(pow(i,3)+pow(j,3)+pow(k,3)==c){
	   printf("%d ",c);
	}
  }
  getchar();
  return 0;
}

自守数

如果某个数的平方末尾几位数等于这个数,那么久称这个数为自守数。例如5和6是一位自守数(5*5=25 6*6=36),25*25=625 76*76=5776 ,所以25和76是自守数

自守数还有一个规律比如:

5+6=11=10¹+1

25+76=101=10²+1

625+376=1001=10³+1

所以两个n位自守数之和等于10的n次方+1

#include<stdio.h>
int main()
{
  long faciend,num,mod,n_mod,p_mod;
  //mod被乘数的系数,n_mod乘数的系数,p_mod部分乘积的系数
   long i,t,n;  //临时变量
   printf("设置最大数:");
   scanf("%ld",&num);
   printf("1~%ld之间有以下自守数:\n",num);
   for(i=1;i<num;i++){
      faciend=i;   //被乘数
	  mod=1;
	  do{
	    mod*=10;                //被乘数的系数
		faciend/=10;
	  }while(faciend>0);      //循环求出被乘的系数
	  p_mod=mod;            //p_mod为截取部分积时的系数
	  faciend=0;             //积的最后N位
	  n_mod=10;            //为截取乘数相应位时的系数
	  while(mod>0){
	    t=i%(mod*10);      //获取被乘数
		n=i%n_mod-i%(n_mod/10);    //分解出每一位乘数作为乘数
		t=t*n;                 //相乘结果
		faciend=(faciend+t)%p_mod;          //截取乘积的后面几位
		mod/=10;                      //调整被乘数的系数
		n_mod*=10;                  //调整乘数的系数
	  }
	  if(i==faciend){             //若为自守数,则输出
	    printf("%ld ",i);
	  }
   }
   printf("\n");
   return 0;
}

素数

#include<stdio.h>
#define MAXNUM 1000      //寻找素数的范围  

int PrimeNum(int i)          //判断是否是素数
{
   int j,flag=1;
   for(j=2;j<i-1;j++){      //循环整除每一个数
      if(i%j==0){        //i能被j整除,表示不是质数
	     flag=0;
		 break;
	  }
   }
   return flag;
}       
int main()
{
   int i,j,c=0;
   int prime[MAXNUM+1]; //保存素数
   for(i=2;i<=MAXNUM;i++){  //初始化数组
	   prime[i]=1;            //标志位1表示对应的数是质数
   }
   for(i=3;i<=MAXNUM;i++){   //循环计算各数
      prime[i]=PrimeNum(i);        //计算数i是否为素数
   }
   printf("以下是2~%d之间的素数:\n",MAXNUM);
   for(i=2;i<MAXNUM;i++){    //输出质数
        if(prime[i]==1){    //若是质数
		   printf("%4d ",i);  //输出质数
		   c++;
		   if(c%10==0){   //每行10个数据
		     printf("\n");
		   }
		}
   }
   printf("\n");
   return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41398448/article/details/81570897