0%

分解质因数

2018年8月20日 下午3:54
分解质因数_百度百科

实现1:双重循环

1
2
3
4
5
6
7
8
9
10
11
int fjzys(int k)
{
int i=2;
for ( ; i<=k ; i++ ) //当因数i<=k时,实现该循环,每次循环因数i自加1
for ( ; k%i==0 ; j++ ) //当k整除当前因数,实现该循环,每次循环下标j自加1
{
k/=i; //使k=k/i
a[j]=i; //存入因数
}
return 0;
}

实现2:单层循环

  1. 可直接在VC6.0运行
  2. 这道题使用的是单层循环,思路总结:
    1. 其实这种要求下,while循环的遍历对象是i。平常来说,我们的思维是让i作为一个计数值,不断的进行1的累加,即i++,i的累加是不间断的
    2. 但是在这里,i的累加是间断的,需要通过if来判断是否可以进行i++,甚至要倒退回去,即i=2
    3. 也就是说,这里的i不是递增的,而是可大可小,来回徘徊
  3. 单层循环与双层循环的思维区别?
    1. 双层循环是对我们正常现实生活结题方式的表达形式模拟
    2. 单层循环,在我们通过例子去尝试时,我们专门的观察i,即被除数在整个流程中变化情况。最后的问题时:在什么情况下i++,什么情况下i=2。
    3. 而双层循环的问题是:在给定一个数的时候,如何遍历得到他的最小质因数。
    4. 通俗来说:其实就是提出的问题不同,最后解决问题的方式也就不同了。
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      #include <stdio.h>
      int m,b,c=0,j=0;
      int a[10]; //存放质因数
      int fjzys(int k)
      {
      int i=2;
      while(k>=i) //判断k是否合格
      {
      if(k%i==0) //判断k是否整除当前因数
      {
      a[j]=i; //存入因数
      k/=i; //余数
      i=2; //令i重新等于2
      j++; //计数值
      }
      else
      {
      i++; //不能整除则当前因数为非质因数
      }
      }
      return 0;
      }

实现3:单层循环

此代码因为用了long long int,为C99标准,故不可在VC6.0上运行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <stdio.h>
#include <math.h>

int main()
{
int i,b;
long long int in;
/*采用64位整型,以便输入更大的数*/
freopen("F://1.txt","r",stdin);
freopen("F://2.txt","w",stdout);
while(scanf("%lld",&in)!=EOF)
{
/*在F://1.txt中输入x个数N(N>=2)以换行符或空格符隔开,当没有输入时循环会自动结束*/
b=0;/*用于标记是否是第一个质因数,第一个质因数在输出时前面不需要加空格*/
for(i=2;in!=1;i++)
{
if(in%i==0)
{
in/=i;
b?printf("%d",i):printf("%d",i),b=1;
i--;
/*i--和i++使得i的值不变,即能把N含有的所有的当前质因数除尽,例如:24会一直把2除尽再去除3*/
}
printf("\n");
}
}
return 0;
}