hdoj-2098-分拆素数和(解题报告)

该博客详细介绍了HDU 2098题目的解题过程,主要讨论如何将偶数拆分为两个不同的素数,并提供了错误分析及正确解题思路。博主通过编写判断素数的函数,解决了这个问题,指出循环起始点应为3而非5,并确保拆分出的素数不同。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=2098

问题描述:

分拆素数和

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 38752    Accepted Submission(s): 16942


Problem Description

把一个偶数拆成两个不同素数的和,有几种拆法呢?

Input

输入包含一些正的偶数,其值不会超过10000,个数不会超过500,若遇0,则结束。

Output

对应每个偶数,输出其拆成不同素数的个数,每个结果占一行。

Sample Input

  
  
30 26 0

Sample Output

  
  
3 2
 

题目分析:对于任意偶数,拆成两个不同的素数,求有几种拆法。

解题思路:函数求解,写一个判断素数的函数,在主函数中调用两次,若i和n-i都成立,结果加一。

错误原因:循环应从可拆出的最小素数3开始,而不是可拆出两个不同素数的最小数5开始,且拆出的两个素数是两个不同素数。

代码实现:

#include<stdio.h>
#include<math.h>
int prime(int m);
int main (void)
{
   int n,i,a;
   while(scanf("%d",&n),n!=0)
    {
       a=0;
       for(i=3;i<n/2;i++)
       {
           if(prime(i)!=0)//找出可拆出的两个素数中较小的数
           {
                if(prime(n-i)!=0)//若n-i的值也为素数,结果加一
                    a++;
           }
       }
       printf("%d\n",a);
    }
   return 0;
}
int prime(int m)//判断素数
{
   int i,k;
   if(m==1)
       return 0;
   k=(int)sqrt(m);
   for(i=2;i<=k;i++)
    {
       if(m%i==0)
          return 0;
    }
   return 1;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值