| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 847 人关注过本帖
标题:求合数并作分解因式,帮忙看看有没有逻辑错误!!
只看楼主 加入收藏
mashrb
Rank: 2
等 级:论坛游民
帖 子:47
专家分:29
注 册:2010-6-30
结帖率:76.92%
收藏
已结贴  问题点数:50 回复次数:7 
求合数并作分解因式,帮忙看看有没有逻辑错误!!
/***求解一个数是不是素数,如果不是,求解其分因式***/

#include "stdio.h"

main() {

  int num,i,in;
  for(;;){
  
           printf("Please enter one number:\n");
           scanf("%d",&num);
           if(num<=1||num>32767);
           else break;
          }   /*  如果输入的数太多或小于零则重新输入到符合为止 */

  for(i=2;i<=(int)(num/2);i++)
  {
      if(num%i==0)                          /*****能整除则为非质数*****/
     {
         printf("The number is NO a prime \n");
         printf("num=");                    /*****显示其质因数******/
         for(in=2;in<=(int)(num/2);in++)
         {
             if(num%in==0)
             {
                 printf("%d*",in);
                 num=num/in;
                 in=1;                       /*******这个很重要,我找了N久*******/
              }
          }
          printf("%d\n\n",num);              /*****这个是最后的质因子**********/
          break;
         
      }
      else if(i==(int)(num/2)) /* 用这一句来判断其为质数 */
           {printf("The number is a prime \n\n");break;}
         
   }         
system("pause");
}
有没有其它可以改良的地方??谢谢!!














.
搜索更多相关主题的帖子: 并作 逻辑 分解 因式 合数 
2010-07-20 21:38
flyingcat
Rank: 4
来 自:HDU
等 级:业余侠客
威 望:2
帖 子:55
专家分:230
注 册:2010-7-18
收藏
得分:0 
- -没太看得明白你的代码,自己写了一个,加了点注释,希望你能看得懂...
程序代码:
#include "stdio.h"
#include "math.h"
int IsPrime(int num)//判断一个数是不是素数
{
    int t,i;
    t=(int)sqrt((double)num)+1;//素数的定义是,该数只能被1和其本身整除,在实现中,只要从2到其本身的根号没有一个被整除就行了
    for(i=2;i<t;i++)
        if(!(num%i))//在2到t的范围内找到一个能整除原来的除的,则为合数,返回0
            return 0;
    return 1;
}
int main()
{
    int num,i;
    while(1)//可以用这种方式建立死循环
    {
        printf("Please enter one number:\n");
        scanf("%d",&num);
        if(num<=1||num>32767)
            break;//如果超出这个范围,中断,没明白你原来写的是何意....
        if(IsPrime(num)==1)
        {
            printf("The number is a prime \n\n");//该数是素数
            continue;
        }
        for(i=2;i<=num;i++)//这个循环比较关键吧,如果一个数合数,从2开始找,比如8,能被2整除,于是输出2,并把8除以2,得4,然后回到除2的起点(标记A),再做一次,直到除完2
                           //再比如这个数是6,能被2整除,完后得3,然后3不能被2整除,循环继续,i==3,可以被整除,完后得1,此时循环不成立,退出
        {
A:
            if(!(num%i))
            {
                printf("%d ",i);
                num/=i;
                goto A;
            }
        }
        printf("\n");
    }
    return 0;
}

2010-07-20 22:44
mashrb
Rank: 2
等 级:论坛游民
帖 子:47
专家分:29
注 册:2010-6-30
收藏
得分:0 
不是吧??我那有问题吗??看来我要重新写一次了!郁闷!!
2010-07-21 12:36
flyingcat
Rank: 4
来 自:HDU
等 级:业余侠客
威 望:2
帖 子:55
专家分:230
注 册:2010-7-18
收藏
得分:0 
回复 3楼 mashrb
有些逻辑错误....
2010-07-21 12:37
mashrb
Rank: 2
等 级:论坛游民
帖 子:47
专家分:29
注 册:2010-6-30
收藏
得分:0 
帮忙找出来好吧??
2010-07-21 12:42
flyingcat
Rank: 4
来 自:HDU
等 级:业余侠客
威 望:2
帖 子:55
专家分:230
注 册:2010-7-18
收藏
得分:30 
程序代码:
//好了……看看吧……
#include "stdio.h"
int main() {
    int num,i,in;
    for(;;){
        printf("Please enter one number:\n");
        scanf("%d",&num);
        if(num<=1||num>32767) //你这句的意思是:如果输入的数字大于1,小于等于32767的,中断操作,注意你在if后面加的分号,以下注释都为去掉分号后的结果
                                //另外一句:如果你得到了一个大于1小于等于32767的数,要做什么?在这个for里面,你只是一直要求输入一个(1,32767]的数,加上goto吧
            goto A;
        else break;
    }
A:
    for(i=2;i<=(int)(num/2);i++)
    {
        if(num%i==0)             
        {
            printf("The number is NO a prime \n");
            printf("num=");                
            for(in=2;in<=(int)(num/2);in++)
            {
                if(num%in==0)
                {
                    printf("%d*",in);
                    num=num/in;
                    in=1;                      //这句我感觉还是用我那个代码中的goto方便,虽然有的时候goto都不被建议
                }
            }
            printf("%d\n\n",num);
            break;
        }
        else if(i==(int)(num/2))
        {
            printf("The number is a prime \n\n");
            break;
        }
    }       
    return 0;
    //其他的我也没调试太多,你看看吧,这样改应该是你要求的
}
2010-07-21 13:11
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 
找了个新的,LZ参考一下:
#include<stdio.h>
#include<string.h>
#include<math.h>
#define SIZE 5000
#define SIZELINE 20000
int x[SIZE]={2},l; /*质数表*/
struct
{
      char ok;
      int l[200];
      short p;
} countline[SIZELINE];
void qsort(int low,int high,int key[])
{
     int i,j,tag;
     i=low; j=high;
     if(i<j)
     {
       tag=key[i];
       do
       {
         while(tag<key[j] && i<j) j--;
         if(i<j)
         {
                key[i]=key[j];
                i++;
                while(tag>=key[i] && i<j) i++;
                if(i<j)
                {
                       key[j]=key[i];
                       j--;
                }
         }
       }while(i<j);
       key[i]=tag;
       qsort(low,j-1,key);
       qsort(i+1,high,key);
     }
}
int main(void)
{
    int i,j,k,tmp;
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        l=1;
        memset(countline,0,sizeof(countline));
        for(i=3;i<=n;i++)
        {
          tmp=sqrt(i);
          for(j=2;j<=tmp;j++)
            if(i%j==0) break;
          if(j>tmp)
          {
            x[l]=i;
            l++;
          }
        }
        countline[0].ok=1;
        for(i=0;i<l;i++)
        {
          for(j=n;j>0;j--)
          {
            if(j<x[i]) break;
            if(!countline[j].ok && countline[j-x[i]].ok)
            {
              countline[j].ok=1;
              countline[j].l[countline[j].p]=x[i];
              countline[j].p++;
              k=0;
              while(k<countline[j-x[i]].p)
              {
                countline[j].l[countline[j].p]=countline[j-x[i]].l[k];
                countline[j].p++; k++;
              }
            }
          }
          if(countline[n].ok) break;
        }
        
        qsort(0,countline[n].p-1,countline[n].l);
        for(i=0;i<countline[n].p;i++) printf("%4d ",countline[n].l[i]);
        printf("\n");
    }
    return 0;
}

欢迎来到我的博客:http://blog..cn/noisunyuhong
2010-07-21 13:15
ggyy4k
Rank: 5Rank: 5
等 级:职业侠客
帖 子:111
专家分:334
注 册:2010-6-28
收藏
得分:20 
回复 楼主 mashrb
从算法上来看,是没有任何问题的,但从效率上来看,就有点问题了,直接从判断素数那段代码看
for(i=2;i<=(int)(num/2);i++)
  {
      if(num%i==0)                          /*****能整除则为非质数*****/
     {
         printf("The number is NO a prime \n");
         printf("num=");                    /*****显示其质因数******/
         for(in=2;in<=(int)(num/2);in++)
         {
             if(num%in==0)
             {
                 printf("%d*",in);
                 num=num/in;
                 in=1;                       /*******这个很重要,我找了N久*******/
              }            /*在这里,你用in<=(int)(num/2)做判断条件,在num较大而非素数时,循环次数相当大。比如2234=2*1117,
                                      那你就要循环1117/2+1=559次。若用j=sqrt(num);i<=j做判断条件,则只需循环35次即可得出结果*/

          }                             
          printf("%d\n\n",num);              /*****这个是最后的质因子**********/
          break;
         
      }
      else if(i==(int)(num/2)) /* 用这一句来判断其为质数 */
           {printf("The number is a prime \n\n");break;}
         
   }
2010-07-21 17:23
快速回复:求合数并作分解因式,帮忙看看有没有逻辑错误!!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.077711 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved