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

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

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

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

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

Code:
  1. #include<stdio.h>
  2. #include<math.h>
  3. main()
  4. {
  5. inti,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. #defineM50
  4. main()
  5. {
  6. inta,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. intn,i;
  11. printf("Pleaseinputanumber:/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. }

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值