质数和分解

质数和分解

分析:

本题可以参考集合求数~~
分解成质数之和,所以首先得求素数。由于本题数据不大,打个暴力也行。由于可以分解为多个相同质数的和,所以本题是完全背包。
f[i][j]表示前i个素数和为j的方案数,对于第i个素数,有取和不取两种方案,本题有是求方案数,转移方程就成了:f[i][j]=f[i-1][j]+f[i-1][j-w[i]] (w数组从小到大存求得的素数)。

程序:

二维:

#include <bits/stdc++.h>
using namespace std;
int n,m,w[510];
bool a[510]={};
long long f[510][1010]={};//由于方案数较大,所以会超int
int main()
{
    cin>>n;
    for (int i=2;i<=sqrt(n*1.0);i++)
      if (!a[i])
        for (int j=2;j<=n/i;j++)
          a[i*j]=true;//筛法求素数
    m=0;
    for (int i=2;i<=n;i++)
    {
      if (!a[i]) 
	      w[++m]=i;
    }//素数存到w数组里
    for (int i=1;i<=m;i++)
      f[i][0]=1;
    for (int i=1;i<=m;i++)
      for (int j=1;j<=n;j++)
      {
      	f[i][j]=f[i-1][j];
      	if (j>=w[i])
      	f[i][j]+=f[i][j-w[i]];
      }//dp完全背包求方案数
    cout<<f[m][n];
    return 0;
}

一维:

#include <bits/stdc++.h>
using namespace std;
int n,m,w[510];
bool a[510]={};
long long f[510]={};
int main()
{
    cin>>n;
    for (int i=2;i<=sqrt(n*1.0);i++)
      if (!a[i])
        for (int j=2;j<=n/i;j++)
          a[i*j]=true;
    m=0;
    for (int i=2;i<=n;i++)
    {
      if (!a[i]) 
	      w[++m]=i;
    }
    f[0]=1;
    for (int i=1;i<=m;i++)
      for (int j=w[i];j<=n;j++)
      	f[j]+=f[j-w[i]];
    cout<<f[n];
    return 0;
}

打代码不能手残~~~~~~

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是使用 Python 编写的计算素数和分解因子的程序及其测试代码: ```python import math # 判断是否为素数 def is_prime(n): if n <= 1: return False for i in range(2, int(math.sqrt(n))+1): if n % i == 0: return False return True # 计算小于等于 n 的素数个数 def count_primes(n): count = 0 for i in range(2, n+1): if is_prime(i): count += 1 return count # 计算小于等于 n 的素数和 def sum_primes(n): primes = [] for i in range(2, n+1): if is_prime(i): primes.append(i) return sum(primes) # 分解因子 def factorize(n): factors = [] primes = [] prime_counts = [] for i in range(2, int(math.sqrt(n))+1): count = 0 while n % i == 0: count += 1 n //= i if count > 0: factors.append(i) primes.append(i) prime_counts.append(count) if n > 1: factors.append(n) primes.append(n) prime_counts.append(1) return [[p, c] for p, c in zip(primes, prime_counts)] # 测试计算素数个数和素数和函数 print(count_primes(10)) # 4 print(sum_primes(10)) # 17 # 测试分解因子函数 print(factorize(10)) # [[2, 1], [5, 1]] print(factorize(100)) # [[2, 2], [5, 2]] ``` 以上程序中,我们定义了三个函数:`is_prime` 用于判断一个数是否为素数,`count_primes` 用于计算小于等于 n 的素数个数,`sum_primes` 用于计算小于等于 n 的素数和。这三个函数的实现比较简单,就不再赘述。 而在 `factorize` 函数中,我们使用了一个 while 循环来不断将 n 分解为素因子,如果这个素因子还没有被加入到 `factors` 数组中,则将其加入到 `factors`、`primes` 和 `prime_counts` 数组中,其中 `primes` 数组用于存储素数,`prime_counts` 数组用于存储相应素数的个数。最后,将结果存储在一个二维数组中,并返回。 你可以自行运行代码,验证其正确性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值