算数基本定理:

算术基本定理可表述为:任何一个大于1的自然数 N,如果N不为质数,那么N可以唯一分解成有限个质数的乘积N=P1a1P2a2P3a3……Pnan,这里P1<P2<P3……<Pn均为质数,其中指数ai是正整数。这样的分解称为 N 的标准分解式。最早证明是由欧几里得给出的,现代是由陈述证明。此定理可推广至更一般的交换代数和代数数论。
取自百度百科
简而言之就是任何一个整数都可以用有限个质数来表示。
今天就遇到一道题:分解素因子。
原题如下:请输入图片描述

看到这题表示自己没什么思路,于是百度看了下别人的代码,大概有了点思路。

#include <stdio.h>
#include <math.h>
int isprime(int n)  //判断一个数是不是质数(素数),是返回1,不是返回0
{
  int t = sqrt(n);
  for (int i = 2; i <= t; ++i)
  {
    if (n%i == 0)
    {
      return 0;
    }
  }
  return 1;
}
int main()
{
  int k;
  int n;
  int c = 0;
  scanf("%d", &k);
  int sum[50] = { 0 };
  while (k != 1)
  {
    scanf("%d", &n);
    for (int i = 2; i <= n;) //处理前面k-1个数
    {
      if (n%i == 0 && isprime(i))
      {
        sum[c] = i;
        n /= i;
        c++;
      }
      else
        ++i;
    }
    for (int i = 0; i < c - 1; i++)
    {
      printf("%d*", sum[i]);
    }
    printf("%d\n", sum[c - 1]);
    c = 0;
    k--;
  }
  scanf("%d", &n);
  for (int i = 2; i <= n;)   处理第k个
  {
    if (n%i == 0 && isprime(i))
    {
      sum[c] = i;
      n /= i;
      c++;
    }
    else
      ++i;
  }
  for (int i = 0; i < c - 1; i++)
  {
    printf("%d*", sum[i]);
  }
  printf("%d\n", sum[c - 1]);
  return 0;
}

提交以为能ac,结果被”Time Limit Exceed on test 1“打脸。
继续探索中。
————————–分隔————————–
2018.10.25 22:37 成功AC 还是找了学长,学长给了思路,要我打表提高效率,并且给出了更好的方法无奈还没理解。
/
与上一个最大的区别再于打表,并且用打表的数来直接当作素因子,而不用一个一个重新去判断是否为素数
/

//变量有点多,有点杂
#include <stdio.h>
#include <math.h>
int main()
{
  int prime[6542] = { 0 };    //经实验,65535中共有质数6541个  
  prime[0] = 2;
  prime[1] = 3;
  int j = 2;
  int k = 0;
  int n = 0;
  int c = 0;
  for (int i = 5; i <= 65535; i+=2)   //打表 2-65535的质数
  {
    int t = sqrt(i);
    for (int k = 2; k <= t; k++)
    {
      if (i%k != 0)
      {
        if (k == t)
        {
          prime[j] = i;
          j++;
        }
      }
      else
        break;
    }
  }
  scanf("%d", &k);
  int sum[65535] = { 0 };
  while (k != 1)    //基本与前面相同
  {
    scanf("%d", &n);
    for (int i = 0; prime[i] <= n;)   //基本上是把i改成了prime[i],下同,减少了判断的次数
    {
      if (n%prime[i] == 0)
      {
        sum[c] = prime[i];
        n /= prime[i];
        c++;
      }
      else
        ++i;
    }
    for (int i = 0; i < c - 1; i++)
    {
      printf("%d*", sum[i]);
    }
    printf("%d\n", sum[c - 1]);
    c = 0;
    k--;
  }
  scanf("%d", &n);
  for (int i = 0; prime[i] <= n;)
  {
    if (n%prime[i] == 0)
    {
      sum[c] = prime[i];
      n /= prime[i];
      c++;
    }
    else
      ++i;
  }
  for (int i = 0; i < c - 1; i++)
  {
    printf("%d*", sum[i]);
  }
  printf("%d", sum[c - 1]);
        return 0;
}

继续探索(学长说的更好的打表方法)。。

最后修改:2019 年 02 月 26 日
如果觉得我的文章对你有用,请随意赞赏