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

本文通过一个因式分解的小程序,探讨了从简单问题出发逐步深入编程思维的过程。作者对比了两种实现方式,一种较为复杂但考虑周全,另一种则简洁高效。通过对这两种方法的分析,总结出了编程实践中应注意的问题。

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

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

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

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

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

#include<stdio.h> #include<math.h> main() { int i,j,t=0; for(i=101;i<=200;i++) { for(j=2;j<=(int)sqrt((double)i);j++) //注意sqrt()函数的参数类型 { if(i%j==0) { break; } else { if(i%j!=0&&j==(int)sqrt((double)i)) { printf("%d ",i); t++; break; } } } } printf("/n%d/n",t); }

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

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

#include<stdio.h> #include<math.h> #define M 50 main() { int a,b,c,t,i,j,n,k,d[M]; j=0; scanf("%d",&a); b=a; for(i=2;i<=(int)sqrt(a);i++) //判断是否是素数,除数从2到(int)sqrt(a) { //就够了,没必要到(a-1) if(a%i==0) { t=1; break; } else { if(a%i!=0&&i==(int)sqrt(a)) { t=0; break; } } } if(t==1) { c=a/2; //这里分解因式时除数只到(int)sqrt(a) for(i=2;i<=c;) //是不行的,比如21=3*7,除数只到 { //(int)sqrt(21)=4肯定不对,但到(a-1) k=a%i; //也没必要,到(a/2)即可! if(k==0) { d[j++]=i; a=a/i; //这里a的值是分解到一个 } //因子后,剩下的。 else { i++; } } } else { if(t==0) { j=2; d[0]=1; d[1]=a; } } printf("%d=",b); for(n=0;n<j-1;n++) { printf("%d*",d[n]); } printf("%d/n",d[j-1]); //控制输出时最后一个因子要单独输出,不然后 } //面会对一个乘号‘*’

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

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值