现在的位置: 首页 > 综合 > 正文

通过一个小程序(关于因式分解的)的体会

2013年10月06日 ⁄ 综合 ⁄ 共 3677字 ⁄ 字号 评论关闭

 

通过一个小程序(关于因式分解的)的体会

      
题目1:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5

这看似简单的题目,因为以前编过一个与它有点关系的:

题目2:判断101-200之间有多少个素数,并输出所有素数。当时我很快就把它搞定了:

 

Code:
  1. #include<stdio.h>   
  2. #include<math.h>   
  3. main()   
  4. {   
  5.     int i,j,t=0;   
  6.     for(i=101;i<=200;i++)   
  7.     {   
  8.         for(j=2;j<=(int)sqrt((double)i);j++)            //注意sqrt()函数的参数类型
      
  9.         {   
  10.             if(i%j==0)   
  11.             {   
  12.                 break;   
  13.             }   
  14.             else  
  15.             {   
  16.                 if(i%j!=0&&j==(int)sqrt((double)i))   
  17.                 {   
  18.                     printf("%d  ",i);   
  19.                     t++;   
  20.                     break;   
  21.                 }   
  22.             }   
  23.         }   
  24.     }   
  25.     printf("/n%d/n",t);   
  26. }   

 

,但到我这里却费了不少劲!

我刚开始想让让它结构化程度高点,但是我花了二十来分钟是把它写出来了,调试时没有error,但是有2warn.我也没管它(我就不把它贴出来了)。但运行时,就是没结果。我想了半天感觉是函数之间接口的问题(虽然当时考二级C时把教材看了3遍,历年真题也都做了,但离一个真正程序员应具备的素质相差还是很远,函数接口没搞好,就说明自己还是没彻底掌握指针、函数部分的知识)。我又调试了大概半小时还是没有结果。最后我决定还是先别追求结构化了,先解决了问题再说。我参照刚写的(虽然有问题),改了改后:

 

Code:
  1. #include<stdio.h>   
  2. #include<math.h>   
  3. #define M 50   
  4. main()   
  5. {   
  6.         int a,b,c,t,i,j,n,k,d[M];   
  7.         j=0;   
  8.         scanf("%d",&a);   
  9.         b=a;   
  10.         for(i=2;i<=(int)sqrt(a);i++)    //判断是否是素数,除数从2到(int)sqrt(a) 
      
  11.         {                        //就够了,没必要到(a-1)
      
  12.                 if(a%i==0)   
  13.                 {   
  14.                         t=1;   
  15.                         break;   
  16.                 }   
  17.                 else  
  18.                 {   
  19.                         if(a%i!=0&&i==(int)sqrt(a))   
  20.                         {   
  21.                                 t=0;   
  22.                                 break;   
  23.                         }   
  24.                 }   
  25.         }   
  26.         if(t==1)   
  27.         {     
  28.                 c=a/2;              //这里分解因式时除数只到(int)sqrt(a) 
      
  29.                 for(i=2;i<=c;)          //是不行的,比如21=3*7,除数只到
      
  30.                 {                       //(int)sqrt(21)=4肯定不对,但到(a-1)
      
  31.                         k=a%i;      //也没必要,到(a/2)即可!
      
  32.                         if(k==0)   
  33.                         {   
  34.                                 d[j++]=i;   
  35.                                 a=a/i;          //这里a的值是分解到一个
      
  36.                         }                       //因子后,剩下的。
      
  37.                         else  
  38.                         {   
  39.                                 i++;   
  40.                         }   
  41.                 }   
  42.         }   
  43.         else  
  44.         {   
  45.                 if(t==0)   
  46.                 {   
  47.                         j=2;   
  48.                         d[0]=1;   
  49.                         d[1]=a;   
  50.                 }   
  51.         }   
  52.         printf("%d=",b);   
  53.         for(n=0;n<j-1;n++)   
  54.         {   
  55.                 printf("%d*",d[n]);   
  56.         }   
  57.         printf("%d/n",d[j-1]);  //控制输出时最后一个因子要单独输出,不然后
      
  58. }                               //面会对一个乘号‘*’
      

 

这样就对了。自己本以为这样很好,比如算法复杂度减小了很多,输出时也做了相应的控制。但是我看到答案时,我傻眼了:

 

Code:
  1. 程序分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成:     
  2. (1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。    
  3. (2)如果n<>k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数你n,    
  4.  重复执行第一步。    
  5. (3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步。   
  6. 程序代码:   
  7. #include<stdio.h>   
  8. main()   
  9. {   
  10.         int n,i;   
  11.         printf("Please input a number:/n");   
  12.         scanf("%d=",&n);   
  13.         printf("%d=",n);   
  14.         for(i=2;i<=n;i++)   
  15.         {   
  16.                 while(n!=i)   
  17.                 {   
  18.                         if(n%i==0)   
  19.                         {   
  20.                                 printf("%d*",i);   
  21.                                 n=n/i;   
  22.                         }   
  23.                         else  
  24.                                 break;   
  25.                 }   
  26.         }   
  27.         printf("%d/n",n);   
  28. }   

 

至少直观上只从代码量上看,比我写的少多了,最主要的是,本以为自己的算法考虑的比较周全,看了答案的分析才知道自己差了的很远。刚开始还想把它结构化程度高点,现在才发现被自己想复杂了,我也知道结构化很好,但就只针对这题而言,完全没必要把输入部分,分解部分,输出部分,分别放在不同的函数中,因为这只是一个很小的小程序,这不是工程文件!

      
通过做这个题感觉自己离一个真正的程序员相差太远!自己还应该把数据结构,指针,数组,函数部分反复学习,反复操练!

抱歉!评论已关闭.