质数和分解问题

/*
质数和分解(normal)

Time Limit:1000MS  Memory Limit:65536K
Total Submit:178 Accepted:66 

Description 

任何大于 1 的自然数 n,都可以写成若干个大于等于 2 ,且小于等于 n 的质数之和表达式(包括只有一个数构成的和表达式的情况),并且可能有不止一种质数和的形式。例如9 的质数和表达式就有四种本质不同的形式: 
9 = 2+5+2 = 2+3+2+2 = 3+3+3 = 2+7 。 
这里所谓两个本质相同的表达式是指可以通过交换其中一个表达式中参加和运算的各个数的位置而直接得到另一个表达式。 
试编程求解自然数 n 可以写成多少种本质不同的质数和表达式。 


Input 

(prime.in)文件中的每一行存放一个自然数 n , 2≤n≤200。

Output 

(prime.out)依次输出每一个自然数 n 的本质不同的质数和表达式的数目。

Sample Input 


2

Sample Output 


1

*/
/*
说明: 这个程序效率不高,哪位有更高的PM我一下,谢谢!!!发至:oopos@126.com
*/
#include 
< stdio.h >
#include 
< math.h >
#include 
< string .h >

#define  MAX 201 

int  prime[MAX] = { 0 },lp = 0 ,total = 0 ;

void  makeprime( void )
{
     
int  i,j ;
     prime[
++ lp]  =   2  ;
     
for (i = 3  ; i <=  MAX ; i ++ )
     {
             
for (j = 2  ; j * <=  i ; j ++ )
             
if  (i  %  j  ==   0 )
             
break  ;
             
if (j * >  i)
             prime[
++ lp]  =  i ;
             
     }
}

int  is_prime( int  x)
{
    
int  y;
    
for (y = 1  ; y <=  lp ; y ++ )
    
if (x  ==  prime[y])
    
return   1  ;
    
return   0  ;
}

int  is_ok( int   * sum, int  num)
{
    
int  i ;
    
for (i = 1  ; i <=  num ; i ++ )
    
if ! is_prime(sum[i]))
    
return   0  ;
    
return   1  ;
}

        
void  trytodo ( int   * sum, int  min, int  max, int  num)
{
     
int  p,q ;
     
if (is_ok(sum,num))  /* 检查是否全为质数 */
     {
       total 
++  ;
       
/* for(q=1 ; q<= num ; q++)
       printf("%d ",sum[q]);
       printf(" ");
*/
     }
     
     
for (p = min ; p <=  max / 2  ; p ++ )
     
if (is_prime(p))
     {
           sum[num
+ 1 =  max  -  p ;
           sum[num] 
=  p ;
           trytodo(sum,sum[num],sum[num
+ 1 ],num + 1 );
     }
}


int  main( void )
{
    
int  h,k,n,sum[MAX] = { 0 };
    scanf(
" %d " , & n);
    
    makeprime() ;
    
if (is_prime(n))
    total 
++  ;
    
    
for (h = 2 ; h <=  n / 2  ; h ++ )
    {
          
if  (is_prime(h))  /* 至少要分到一个质数,不然会重复,这也叫剪枝吧 */
          {
               sum[
1 =  h ;
               sum[
2 =  n - h;             
               trytodo(sum,sum[
1 ],sum[ 2 ], 2 ) ;
          }
    }
    
    printf(
" total = %d " ,total);
    
    
/* for(k=1 ; k<= lp ; k++) *//*  产生质数
    printf("%d ",prime[k]);
    printf(" lp=%d ",lp);
*/
    system(
" pause " );
    
return   0  ;
}
 
将一个偶数分解质数因子的过程通常涉及分解该数为2乘以一些质数的乘积。在C++中,你可以编写一个简单的函数来实现这个功能。下面是一个基本的步骤: 1. 首先检查给定的数字是否为2(因为所有偶数都能表示为2的幂),如果是,则直接返回。 2. 使用循环从3开始,直到该数的平方根,查找能整除该数的最大质数。这是因为如果存在更大的质数因子,那么它必须与较小的因子配对存在,它们相乘的结果会小于等于该数。 3. 每次找到一个质数因子,就将其除以该因子并将结果保存下来,然后继续寻找下一个质数因子。 4. 最终的结果就是原始偶数分解成的质数相应的指数。 这是一个伪代码示例: ```cpp #include <iostream> #include <vector> bool isPrime(int num) { if (num <= 1) return false; for (int i = 2; i * i <= num; i++) { if (num % i == 0) return false; } return true; } void primeFactors(int n) { std::vector<int> factors; while (n % 2 == 0) { // 处理2的倍数 factors.push_back(2); n /= 2; } for (int i = 3; i <= std::sqrt(n); i += 2) { // 只考虑奇数因子 while (n % i == 0 && isPrime(i)) { factors.push_back(i); n /= i; } } // 如果n大于2,那n也是质数 if (n > 2) factors.push_back(n); for (int factor : factors) { std::cout << "质因数:" << factor << ", 次数:"; for (int i = 0; i < factors.count(factor); i++) std::cout << factor << "^" << i << " "; std::cout << "\n"; } } int main() { int number; std::cout << "请输入一个偶数: "; std::cin >> number; primeFactors(number); return 0; } ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值