当前位置: 代码迷 >> C语言 >> [原创]NKOJ数分解递归实现
  详细解决方案

[原创]NKOJ数分解递归实现

热度:241   发布时间:2008-01-07 20:05:01.0
[原创]NKOJ数分解递归实现
题目描述:
把一个给定的整数分解成若干个素数的和。
Input
一个数。(32位无符号整型数范围内。)

Output
一些素数。

Sample Input
9Sample Output
3 3 3
实现:
#include<stdio.h>
#include<math.h>
int prime(unsigned int n)  //素数判断
{
   unsigned int i;
   int flag=0;  //标志位设为0

   for(i=2;i<=sqrt(double(n))+1;i++)
   {
       if(n==2) { flag=1; break; }
       if(n%i!=0) flag=1;
       else { flag=0; break; }
   }
    if(flag==1) return 1;
    if(flag==0) return 0;
}
void serparte(unsigned int n,int k,int i)  //分解数
{
    if(n%i==0||prime(n))
    {
        k=n-i;
        printf("%d ",i);
        if(prime(k)) printf("%d ",k);
        else
             serparte(k,k,i);
    }
    else
    {
        ++i;
        serparte(n,k,i);
    }
}
int main()
{
    int n,k=0;
    while(scanf("%d",&n)!=EOF)
        serparte(n,k,2);
    return 0;
}
搜索更多相关的解决方案: NKOJ  递归  分解  

----------------解决方案--------------------------------------------------------
在来个非递归的:
#include<stdio.h>
#include<math.h>
int prime(unsigned int n)  //素数判断
{
   unsigned int i;
   int flag=0;  //标志位设为0

   for(i=2;i<=sqrt(double(n))+1;i++)
   {
       if(n==2) { flag=1; break; }
       if(n%i!=0) flag=1;
       else { flag=0; break; }
   }
    if(flag==1) return 1;
    if(flag==0) return 0;
}
void serparte(unsigned int n)  //分解数
{
    int i;
    for(i=2;;)
    {
        if(n%i==0||prime(n))
        {
            n=n-i;
            printf("%d ",i);
            if(prime(n))
            {
                printf("%d ",n);
                break;
            }
            else continue;
        }
        else
        {    ++i;  }
    }
}
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
        serparte(n);
    return 0;
}
时间还是慢~
----------------解决方案--------------------------------------------------------
没有考虑 9 = 7 + 2 或者 5 + 2 + 2 等情况?
----------------解决方案--------------------------------------------------------
把一个给定的整数分解成若干个素数的和。

如果可以我直接给分成若干个2和1/0个3.
----------------解决方案--------------------------------------------------------
回复 4# 的帖子
其实应该说若干个 2 和 0/1 个 3/5/7/11/…
----------------解决方案--------------------------------------------------------
是啊,题目有点松了,要说分解成最少个素数还凑合。
----------------解决方案--------------------------------------------------------
原帖由 [bold][underline]zbqf109[/underline][/bold] 于 2008-1-7 21:39 发表 [url=http://bbs.bc-cn.net/redirect.php?goto=findpost&pid=1174167&ptid=196361][/url]
其实应该说若干个 2 和 0/1 个 3/5/7/11/…


完全不需要3后面的数.
----------------解决方案--------------------------------------------------------
呵呵,对了,,,谢谢nuciewth的提醒......从5开始都可以被2,3分解了/////
----------------解决方案--------------------------------------------------------
回复 8# 的帖子
是从2开始
----------------解决方案--------------------------------------------------------
1是不是素数好像又争议~
----------------解决方案--------------------------------------------------------
  相关解决方案