前序:
分解作为数据处理的常用手段,集中体现智能思考与技巧运用,是培养与检验程序设计技能的重要方面;
整数分解质因数 是整数分解中最简单也是最基本的分解案例;
本节是按质因数的乘积形式与指数形式分别设计求解;
分解为质因数乘积形式
对给定区间[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
注意:可以看到,若分解式中没有相同的质因数,其指数形式与乘积形式相同;