VC++编程题 编程实现对大于1的整数进行质因数分解,并求出其和
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VC++编程题 编程实现对大于1的整数进行质因数分解,并求出其和相关的知识,希望对你有一定的参考价值。
编程实现对大于1的整数进行质因数分解,并求出其和。所谓整数的质因子分解是指将整数分解为其所有质数(素数)因数的积,例如,60=2*2*3*5,则整数60的质因数之和为12。定义一个类Decompose实现上述功能。
具体要求如下:
(1) 私有数据成员
●int *a:指向存放对应整数的质因数之和的动态存储空间。
●int *num:指向待分解质因数整数的动态存储空间。
●int n:整数的个数。
(2) 公有数据成员
●Decompose(int m,int b[]):用m初始化n,并用n初始化为动态申请空间的指针a与num。用参数b给数组a赋值。
●void primenum():求整数a[i]的所有质因数,并将这些质因数之和存放到指针num所指向的存储空间中。
●-Decompose():释放动态分配的存储空间。
(3) 在主函数中完成对该类的测试。从键盘输入一组大于1的整数,存放在number数组中,定义类Decompose的对象d,并用number初始化d,调用函数primenum()求number的所有质因数,最后输出测试结果。
在线=高手回答。
#define IS_PRINT_FACTOR 1 //定义是否打印中间结果
class Decompose
private:
unsigned __int64 *num;
unsigned __int64 *sum;
int n;
public:
Decompose();
Decompose(int n,unsigned __int64 *num);
virtual ~Decompose();
int primeNum(unsigned __int64 x,unsigned __int64 *fac);
void primeNum();
void printSum();
;
以下是cpp文件
////////////////////////////////////////////////////////////////////////////////////
// Decompose.cpp: implementation of the Decompose class.
//
//////////////////////////////////////////////////////////////////////
#include "Decompose.h"
#include "stdio.h"
#include "windows.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
Decompose::Decompose()
num=NULL;
sum=NULL;
n=0;
Decompose::Decompose(int n,unsigned __int64 *num)
this->n=n;
this->num=new unsigned __int64[n];
sum=new unsigned __int64[n];
for(int i=0;i<n;i++)
this->num[i]=num[i];
Decompose::~Decompose()
if(num!=NULL)
delete[]num;
if(sum!=NULL)
delete[]sum;
unsigned __int64 sqrt64(unsigned __int64 x)
int i=(sizeof(unsigned __int64)<<3)-1;
if(x==(unsigned __int64)1)
return (unsigned __int64)1;
while(i>=0)
if((x>>i)==1)
break;
i--;
return (unsigned __int64)1<<((i+2)>>1);
int Decompose::primeNum(unsigned __int64 x,unsigned __int64 *fac)
unsigned __int64 i=2,sqrtx=sqrt64(x);
int flen=0;
while(i<sqrtx)
if(x%i==0)//if i is the factor of x
fac[flen++]=i;
x/=i;
sqrtx=sqrt64(x);
else if(i==2) i++;
else i+=2; //if x is not even,then the factor of x must be odd
fac[flen++]=x;
return flen;// flen is the number of integers in fac
void Decompose::primeNum()
unsigned __int64 fac[64];
int i,j,flen;
for(i=0;i<n;i++)
flen=primeNum(num[i],fac);
#if IS_PRINT_FACTOR
printf("%I64u=",num[i]);
for(j=0;j<flen;j++)
printf("%I64u",fac[j]);
if(j!=flen-1)
printf("x");
else printf("\n");
#endif
for(j=0,sum[i]=0;j<flen;j++)
sum[i]+=fac[j];
void Decompose::printSum()
int i;
for(i=0;i<n;i++)
printf("sum(%I64u)=%I64u\n",num[i],sum[i]);
void main()
LARGE_INTEGER t1,t2,frq;
unsigned __int64 num[]=1234,1234567,123456789,1234567891011,12345678910111213;
int i,n=sizeof(num)/sizeof(*num);
Decompose d(n,num);
QueryPerformanceFrequency(&frq);
QueryPerformanceCounter(&t1);
d.primeNum();
QueryPerformanceCounter(&t2);
printf("\n");
d.printSum();
printf("\ntime=%f sec\n",(double)(t2.QuadPart-t1.QuadPart)/frq.QuadPart);
参考技术A 小小感谢一下
如果不是编了这个程序 我还不知道能在.cpp里这么写class的
现实就是 原来我还有好多不懂的
----------开场分割线----------------
注释神马 是写给自己看的 基本都删掉了
因为LZ要求写的很清楚了 所以应该没什么需要说明的 希望对你有用
ps: 爷用了c 不是c++ (T.T)~~
----------代码分割线---------------
#include<stdlib.h>
#include<stdio.h>
class Decompose
private://private 是完全私有的 只有当前类中的成员函数能访问到 (数及其因数和的输出实现)
int *a;
int *num;
int n;
public:
Decompose(int m,int b[]);//构造函数
~Decompose();//析构函数
void primenum();//成员函数
void printRS();//成员函数
;
//以下是cpp文件
Decompose::Decompose(int m,int b[])
n=m;
a=(int *)malloc(n*sizeof(int));
num=(int *)malloc(n*sizeof(int));
if(!a)
printf("error-a!\n");
exit(1);
if(!num)
printf("error-a!\n");
exit(1);
for(int i=0;i<n;i++)
*(num+i)=b[i];
Decompose::~Decompose() //析构函数 http://baike.baidu.com/view/1277985.htm
if(a!=NULL)
delete[]a;
if(num!=NULL)
delete[]num;
void Decompose::primenum()//例如60=2*2*3*5
int x,y;
for(int i=0;i<n;i++)
x=*(num+i);
y=0;//1不是质因数 所以 y不用设为1
for(int j=2;j<x;j++)
if(x%j==0)//百分号取余
y+=j;
x=x/j;
y+=x;//加上最后一个素数
*(a+i)=y;
void Decompose::printRS()
for(int i=0;i<n;i++)
printf("整数%d的质因数和为%d\n",*(num+i),*(a+i));
void main()
int number[50];
int i=0;
printf("Please input a list of positive integers - no 1!\n");//输入非1正整数
for(;i<50;i++)
scanf("%d",&number[i]);
if(number[i]==-1)
break;
if(number[i]==1)
printf("Please do not input 1!");
Decompose d(i,number);
d.primenum();
d.printRS();
d.~Decompose();
参考资料:学习了一下2楼……^_^
参考技术B 没事,灌水,这个问题对我还有点儿难度,需要研究下Go面试题:将一个正整数分解质因数 (Golang经典编程案例)
案例:将一个正整数分解质因数。例如:输入70,打印出:70=2 * 5 * 7。
分析思路:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成:
-
如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。
-
如果n<或者>k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数你n,重复执行第一步。
-
如果n不能被k整除,则用k+1作为k的值,重复执行第一步。
代码如下:
package main
import "fmt"
func main()
var n int
fmt.Print("请输入一个正整数:")
fmt.Scan(&n)
fmt.Printf("把这个数分解质因数为:%d=", n)
for i := 2; i < n; i++
if n%i == 0
fmt.Printf("%d*", i)
n /= i
fmt.Println(n)
执行结果如下图所示:
以上是关于VC++编程题 编程实现对大于1的整数进行质因数分解,并求出其和的主要内容,如果未能解决你的问题,请参考以下文章
Go面试题:将一个正整数分解质因数 (Golang经典编程案例)
电子学会图形化scratch编程等级考试四级真题答案解析(判断题)2020-12
用java编程 将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。