质因数分解

来源:互联网 发布:理解大数据 编辑:程序博客网 时间:2024/04/30 07:21

前序:
分解作为数据处理的常用手段,集中体现智能思考与技巧运用,是培养与检验程序设计技能的重要方面;

整数分解质因数 是整数分解中最简单也是最基本的分解案例;

本节是按质因数的乘积形式与指数形式分别设计求解;


分解为质因数乘积形式

对给定区间[m,n]的正整数分解质因数,每一整数分解表示为质因数从小到大顺序的乘积形式,如果被分解的整数本身是素数,则注明为素数;

例如,2016=2*2*2*2*2*3*3*7,2017=(素数!);

1.说明:

对区间中的每一个整数i(b=i 以保持 i 不变)设置k设置实施试商,判别k是否为整数 i 的因数;

注意到整数 i 的最大因数可能为 i/2,用k(2~i/2)试商是可行的,但并不是最省的,事实上,用k(2~sqrt(i))试商可避免许多无效操作,其复杂度要低得多;

在k试商循环中,若k不能整除b,说明数k不是b的因数,k增1后继续试商;

若k能整除b,说明数k是b的因数,打印输出“k*”;

b除以k的商赋给b(b=b/k)后继续用k试商(注意,可能有多个k因数),直至k不能整除b,k增1后继续试商;

按上述从小到大试商确定的因数显然为质因数;

如果整数i存在大于sqrt(i)的因数(至多一个),在试商循环结束后应用试商后b值的范围“b>1 and b< i”进行判别并补上,不得遗失;

如果整个试商后b的值没有任何缩减,仍为原待分解数i,说明i是素数,作素数说明标记;

2.程序设计:

#include<stdio.h>#include<math.h>int main(){   long b,i,k,m,n;   printf("请输入m,n:");   scanf("%ld,%ld",&m,&n);   for(i=m;i<=n;i++)   /*i为待分解的整数*/   {      printf("  %ld=",i);      b=i;      k=2;      while(k<=sqrt(i))  /*k为试商因数*/      {         if(b%k==0)         {            b=b/k;            if(b>1)            {               printf("%ld*",k);               continue;  /*k为质因数,返回再试*/            }            if(b==1)               printf("%ld\n",k);         }         k++;      }      if(b>1 && b<i)   /*判别并输出大于i平方根的因数*/         printf("%ld\n",b);      if(b==i)     /*b=i,表示i无质因数*/         printf("(素数!)\n");   }}

3.程序运行示例及其注意事项:

请输入m,n:20152015,2015202020152015=5*13*31*73*13720152016=2*2*2*2*163*772720152017=3*3*3*74637120152018=2*449*2244120152019=(素数!)20152020=2*2*3*5*7*47981

分解为质因数指数形式

整数质因数分解的指数形式是对乘积形式的精简,在质因数指数形式中,首先按质因数从小到大排列;

如果存在相同的质因数,要求写成指数的形式;

例如分解1960,质因数指数形式为: 1960=2^3*5*7^2;

1.说明:

在以上程序基础上需要做一些变通:

引入变量j统计素因子的个数,j=1时不打印指数;j>1时需要加打指数(^j),这样要求程序设计做必要的判别条件;

同时,为了扩展分解整数的范围,程序设计采用双精度变量,这样相关整除与商取整函数相应改变;

2.程序设计:

#include<stdio.h>#include<math.h>int main(){   double b,i,k,m,n;   int j;   printf("请输入m,n:");   scanf("%lf,%lf",&m,&n);   for(i=m;i<=n;i++)   {      printf("%.0f=",i);      b=i;      k=2;      j=0;      while(k<=pow(i,0.5))   /*k为试商因数*/      {         if(fmod(b,k)==0)         {            b=floor(b/k);            j++;            continue;   /*k为质因数,返回再试*/         }         if(j>=1)         {            printf("%.0f",k);            if(j>1)               printf("^%d",j);   /*打印指数形式*/            if(b>1)               printf("*");         }         k++;         j=0;      }      if(b>1 && b<i)         printf("%.0f",b);  /*输出大于i平方根的因数*/      if(b==i)         printf("(素数!)");  /*b=i,表示i无质因数*/      printf("\n");   }}

3.程序运行示例及其注意事项:

请输入m,n:201520172022,201520172025201520172022=2*3*13*17*71*1373*1559201520172023=(素数!)201520172024=2^3*59*149*2865433201520172025=3^3*5^2*298548403

注意:可以看到,若分解式中没有相同的质因数,其指数形式与乘积形式相同

1 0
原创粉丝点击