质因数分解

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

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

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


分解为质因数乘积形式

对给定区间[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,20152020
20152015=5*13*31*73*137
20152016=2*2*2*2*163*7727
20152017=3*3*3*746371
20152018=2*449*22441
20152019=(素数!)
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,201520172025
201520172022=2*3*13*17*71*1373*1559
201520172023=(素数!)
201520172024=2^3*59*149*2865433
201520172025=3^3*5^2*298548403

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

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值