求整数因子算法

baidu01 2009-06-15 12:39:49
对于一个整数,求出它的所有因子,如12=2*2*3
...全文
600 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
UpdateEveryday 2009-06-16
  • 打赏
  • 举报
回复
easy
#include <stdio.h>

void main(void)
{
int num = 1024; /* sample # */
int count = 2;

printf("\n %d = ",num);

while(num >= count)
{

if (!(num % count))
{
printf(" %d * ",count);
num = num / count;
}
else
{
count++;
}
}
printf("\b\b \n\n");
}
mu_yang 2009-06-16
  • 打赏
  • 举报
回复
题目有些不严谨
对于一个正整数,将它分解为质数因子的积
mu_yang 2009-06-16
  • 打赏
  • 举报
回复

素数 = 2 ;
while(整数>=素数)
{
if( 整数 % 素数 == 0)
{
输出 素数;
整数 /= 素数 ;
if (整数==1)break;
输出 '*';
}
else
素数 ++ ;
}
adventurelw 2009-06-16
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 jqzwin 的回复:]
实际上,更有效的方法,只需要循环到小于等于给定数的开方的素数就可以了。一次记下两个因子——除数和商。
[/Quote]

但你仍然需要判断两个因子是否都是素数啊。。。。。而一个数,除去其本身,是不会出现大于其1/2的因子的。
所以,对素数的判断,至少需要进行到数的1/2处。
棋盗 2009-06-16
  • 打赏
  • 举报
回复
#include<iostream.h>
#include <math.h>
int main()
{
void qiuyinzi(int a,int*p);
int a,s[100];
cout << "输入一个整数:";
cin>>a;
cout<<a<<"=";
qiuyinzi(a,s);
return 0;
}

void qiuyinzi(int a,int*p)
{int b,c; double t;
c=a; t=sqrt(a);
for(b=2;b<=a;b++)
{if((a%b)==0)
{a=a/b;*p=b;cout<<*p<<"*";p++;qiuyinzi(a,p);}

if(a!=c) break;
}

}





速度就不知道了,写得简单了点,能实现。


子瓜个个 2009-06-16
  • 打赏
  • 举报
回复
实际上,更有效的方法,只需要循环到小于等于给定数的开方的素数就可以了。一次记下两个因子——除数和商。
adventurelw 2009-06-16
  • 打赏
  • 举报
回复
其实只需要获得小于等于给定数的1/2的素数就可以了。
guocai_yao 2009-06-16
  • 打赏
  • 举报
回复
mark
Walf_ghoul 2009-06-16
  • 打赏
  • 举报
回复
本来想加个下划线的-_-||
Walf_ghoul 2009-06-16
  • 打赏
  • 举报
回复
修改一下循环结束条件,使效率提高

/*
author:Walf_GHOUL
实现功能:1.输入一个整数base,获得获得小于等于base的所有质数
2.将base分解成若干个质数相乘并输出
*/
#include <iostream>
#include <math.h>

using namespace std;

int* GetDivisor(int base); //获得小于等于base的所有质数

int GetFirstTrue(int i,bool* a ,int base); //获得第一个值为true的下表

int main()
{
int base = 2;
cout << "输入一个整数:";
cin >> base;
int* a = GetDivisor(base); //a存储质数表
cout << "分解结果为:";
if(base == a[base-1]) //如果输入的数是质数,输出
{
cout << base <<"="<<1<<'*'<<base<<endl;
}
else //如果不是质数,寻找质数因子
{
bool check = true;
int i = 1;
int temp = base;
cout << base << " = ";
while( temp > 1) // 若被除数为1,说明已经完全分解了 {
if(a[i] > 0 && (temp % a[i]) == 0) //如果该质数是因子输出
{
cout << a[i];
if(a[i] != temp)
{
cout<<"*";
}
temp = temp / a[i]; //改变被除数,从2开始重新寻找因子
i = 1;
}

else
{
i++;
}
}
}

delete[] a;
return 0;
}

int GetFirstTrue(int i,bool* a ,int base)
{
for(int j = i+1;j<base;j++)
{
if(a[j] == true)
return j;
}
return 0;
}

int* GetDivisor(int base)
{
int* a = new int[base];
bool* flag = new bool[base];
int i,j;
for(i = 0 ; i < base ; i++)
{
a[i] = i+1;
flag[i] = true;
}
for( i = 0; i< base;i++)
{
j = GetFirstTrue(i,flag,base);
if(j!=0)
{
for( int k = j+1; k < base ; k++)
{
if(a[k] % a[j] == 0)
{
flag[k] = false;
a[k] = 0;
}
}
}
}
delete[] flag;
return a;
}

Walf_ghoul 2009-06-16
  • 打赏
  • 举报
回复
实现了个,附上代码,以供参考:

/*
author:Walf_GHOUL
实现功能:1.输入一个整数base,获得获得小于等于base的所有质数
2.将base分解成若干个质数相乘并输出
*/
#include <iostream>
#include <math.h>

using namespace std;

int* GetDivisor(int base); //获得小于等于base的所有质数

int GetFirstTrue(int i,bool* a ,int base); //获得第一个值为true的下表

int main()
{
int base = 2;
cout << "输入一个整数:";
cin >> base;
int* a = GetDivisor(base); //a存储质数表
cout << "分解结果为:";
if(base == a[base-1]) //如果输入的数是质数,输出
{
cout << base <<"="<<1<<'*'<<base<<endl;
}
else //如果不是质数,寻找质数因子
{
bool check = true;
int i = 1;
int temp = base;
cout << base << " = ";
for( int j = 0 ;j<base;j++)
{
if(a[i] > 0 && (temp % a[i]) == 0) //如果该质数是因子输出
{
cout << a[i];
if(a[i] != temp)
{
cout<<"*";
}
temp = temp / a[i]; //改变被除数,从2开始重新寻找因子
i = 1;
}

else
{
i++;
}
}
}

delete[] a;
return 0;
}

int GetFirstTrue(int i,bool* a ,int base)
{
for(int j = i+1;j<base;j++)
{
if(a[j] == true)
return j;
}
return 0;
}

int* GetDivisor(int base)
{
int* a = new int[base];
bool* flag = new bool[base];
int i,j;
for(i = 0 ; i < base ; i++)
{
a[i] = i+1;
flag[i] = true;
}
for( i = 0; i< base;i++)
{
j = GetFirstTrue(i,flag,base);
if(j!=0)
{
for( int k = j+1; k < base ; k++)
{
if(a[k] % a[j] == 0)
{
flag[k] = false;
a[k] = 0;
}
}
}
}
delete[] flag;
return a;
}



结果:
输入一个整数:12
分解结果为:12 = 2*2*3
Process returned 0 (0x0) execution time : 2.453 s
Press any key to continue.
ameyume 2009-06-15
  • 打赏
  • 举报
回复
关注ing
光宇广贞 2009-06-15
  • 打赏
  • 举报
回复
好办,求出质数表,然后一个一个去除!
内容简介: 本书论述了算法数论的基本内容,其中包括:连分数、代数数域、椭圆曲线、素性检验、大整数因子分解算法、椭圆曲线上的离散对数、超椭圆曲线。本书的特点是内容涉及面广,在有限的篇幅内,包含了必要的预备知识和数学证明,尽可能形成一个完整的体系。并且本书的部分内容曾多次在中国科学院研究生院信息安全国家重点实验室和广州大学作为硕士研究生教材使用。本书可作为信息安全、数论等专业的研究生教材及相关专业的研究人员、高等学校的教师和高年级学生的参考。 目录: 序 前言 第一章 整数的因子分解 1.1 唯一分解定理 1.2 辗转相除法(欧氏除法) 1.3 Mersenne素数和Fermat素数 1.4 整系数多项式 1.5 环Z和Z[ω] 习题一 第二章 同余式 2.1 孙子定理 2.2 剩余类环 2.3 Euler函数ρ(m) 2.4 同余方程 2.5 原根 2.6 缩系的构造 习题二 第三章 二次剩余 3.1 定义及Euler判别条件 3.2 Legendre符号 3.3 Jacobi符号 习题三 第四章 特征 4.1 剩余系的表示 4.2 特征 4.3 原特征 4.4 特征和 4.5 Gauss和 习题四 第五章 连分数 5.1 简单连分数 5.2 用连分数表实数 5.3 最佳渐近分数 5.4 Legendre判别条件 习题五 第六章 代数数域 6.1 代数整数 6.2 Dedekind整环 6.3 阶的一些性质 第七章 椭圆曲线 7.1 椭圆曲线的群结构 7.2 除子类群 7.3 同种映射 7.4 Tate模和Weil对 7.5 有限域上的椭圆曲线 习题七 第八章 在密码学中的一些应用 8.1 RSA公钥密码 8.2 Uiffie-Hellman体制 8.3 ElGamal算法 8.4 基于背包问题的公钥密码 8.5 秘密共享 第九章 素性检验 9.1 Fermat小定理及伪素数 9.2 强伪素数及Miller-Rabin检验 9.3 利用n-1的因子分解的素性检验 9.4 利用n+1的因子分解的素性检验 9.5 分圆环素性检验 9.6 基于椭圆曲线的素性检验 第十章 大整数因子分解算法 10.1 连分数因子分解算法 10.2 二次筛法 10.3 Pollard的P-1因子分解算法 10.4 椭圆曲线因子分解算法 10.5 数域筛法 习题十 第十一章 椭圆曲线上的离散对数 11.1 椭圆曲线公钥密码 11.2 小步-大步法 11.3 家袋鼠和野袋鼠 11.4 MOV约化 11.5 FR约化 11.6 SSSA约化 11.7 有限域上离散对数的计算 第十二章 超椭圆曲线 12.1 超椭圆曲线的Jacobian 12.2 虚二次代数函数域 12.3 基于超椭圆曲线的公钥密码 附录 一些常用算法 A.1 不可约多项式的判别 A.2 有限域中平方根的求解 A.3 有限域上的分解 A.4 Hensel引理 A.5 格 A.6 Z[x]中多项式的分解 参考文献 免责申明:此书是我在网络上获取的,希望对大家有用。资源版权归作者及其公司所有,如果你喜欢,请购买正版。~~~

64,631

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧