回 帖 发 新 帖 刷新版面

主题:分解质因数

原题:
有一个正整数N(N可能达到120位),它是由若干个不大于65535的正整数相乘而得到的
请把这个数分解成质数因子的乘积
输入:输入文件第一行为N值;
输出:1:质数因子由小到大分行输出;
      2:每一行输出一个质数因子和该因子的个数,用空格隔开;
      3:如果正整数N的分解中有一个以上大于65535的质数,请按照1、2的要求
         分解出小于65535的质数后,在下一行输出:“Data Error”

我的分析:1:首先找出1~65535的所有质数;
          2:分别用质数去除N,一直除到有余数为止,除的次数就是个数;
          3:将所有65535以下的质数乘以个数再相乘,得到的数再用N去除
             如果商大于65535,那么就有有一个以上大于65535的质数;
(由于我不熟悉高精度除法运算,下面程序中没有使用高精度运算)
下面是我的程序:(时间关系无注释)由于接触时间较短,错误是偏地开花
请各位帮帮我找下是否有错误之处,谢谢大家。
(我是高中生,高等数学还没有学…………)

回复列表 (共4个回复)

沙发

inclede<iostream>
using namespace std;
int main()
{
  int zhi_shu[65535]={0,2};
  int I,J,K,M,X,Y,;long int N,S;
  cout<<"Input N:";cin>>N;//输入N
  for(I=3;I<=65535;I++)//外循环:将65535以下的正整数带入判断
    {
       for(J=2;J<=I;J++)
  //内循环:将带入的数判断是否为质数,用3到这个数的所有正整数去除
         {
            if(I%J==0) break;
         }
       zhi_shu[I]=I;//将质数赋给对应的数组元素
    }
  for(k=2;k<=65535;k++)//选出数组中的质数(其余为0)
    {
       if(zhi_shu[k]==0) continue;
       else {Y=N;for(M=0; ;M++)
   //用所选的质数去除N,一直除到有余数为止,除的次数就是质数的个数
              {
                 if(Y%zhi_shu[k])   X=N/zhi_shu[K];
                 else {S=S*zhi_shu[k]*M;
                      cout<<zhi_shu[k]<<'/s'<<M<<endl;}
                 Y=X;
              }}
    }
  if(N/S>=65535) cout<<"Data Error"//商大于65535就是说有个质数大于65535
  return 0;
}

我把注释添上去了,并修改了一些错误

板凳

不错~支持下。

3 楼

1. 获得 N 值
   (小于32766位,因为我用的是QB,有点限制,也可以用VB,那就没有这个限制了.)
2. 做一超长数除法函数,以便调用,两个参数(字符串,被除数,除数),返回商(字符串)

3. 定义数组,先计算好 1-N 的质数表,
   (这样的实现看看我做过的逐级递增的质数函数你才知道这样的效率可以省掉很多事情)
   ( 65535这个范围很小,估计不用几分钟,我用了十个小时,才算到千万级 )

4. 从最小质数开始,除到有余为止,

5. 然后下一个质数(第4步)

4 楼

这个问题我弄过

可以一边生成质数表一边判断是否是质因数

#include <stdio.h>

#define PRIME_SIZE 3000 //质数表空间大小

#define MAX_NUMBER 65535

typedef unsigned long long U_INT64;

int main()
{
    U_INT64 n;
    int i,j;
    int index;
    int pnum[PRIME_SIZE]={0}, pqnt=0;

    scanf("%d",&n);
    
    if(0==n)
    {
        printf("Data Error");
        return 0;
    }
    else if(1==n)
    {
        printf("%d %d\n",1,1);
        return 0;
    }

    for(i=2; n!=1 && i<=MAX_NUMBER; i+=(2==i?1:2))
    {
        j=0;
        while(    pnum[j]!=0
                && i%pnum[j]!=0
                && pnum[j]*pnum[j]<=i )
            ++j;
        if( pnum[j]*pnum[j]>i || 2==i )    //判断i是质数?
        {//若是,则将此数保留在质数表内,供判断后面的质数使用
            pnum[pqnt++]=i;
        }
        else
        {//若不是,判断下一个i
            continue;
        }

        index=0;        //index为质数i对应的最高次数
        while(n%i==0)    //用求得的质数i分解n
        {
            n/=i;
            ++index;
        }
        if(0==index) continue; //若n不能被i分解,判断下一个i

        printf("%d %d\n",i,index);
    }//for
    if(n>1)        //若n还未被分解则还有大于MAX_PRIME的质因数
    {
        printf("Data Error");
    }

    return 0;
}

我来回复

您尚未登录,请登录后再回复。点此登录或注册