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的所有质因数,最后输出测试结果。
在线=高手回答。

/*******Decompose.h**************/
#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,然后按下述步骤完成:

  1. 如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。

  2. 如果n<或者>k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数你n,重复执行第一步。

  3. 如果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。

用java编程 将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。

java编程题 --分解质因数

基础编程题之因数分解