问题出现背景
今天刚好在练习c语言的编程题,好久没有写了,感觉手有一点生,哈,今天,那个认识又一次出现在我的大脑中,coding还是要多coding,以至于下一次coding的时候,才会有coding的感觉。
题目是这样,要求编写程序求两个正整数的最大公约数。
编程初始逻辑
在拿到这一道题的时候,我的初始思路是,
第一,设置两个数组,将这两个输入的数的约数全部存进去
第二,在设置一个公约数数组,将两个数的相同的公约数存放进去
第三,遍历这个数组,使用攻擂法,将最大公约数求出来
程序运行遇到问题
初始代码如先下
// 3、编写程序求两个正整数的最大公约数。
#include<stdio.h>
#define N 100
int main(){
int a,b,i,j,max,tem;
int a1[N],b1[N],c1[N];
//输入a,b的值
printf("输入a,b的值");
scanf("%d,%d",&a,&b);
//将a的公约数存入,a[N]中,
for(i=0;i<=a;i++){
for(j=1;j<=a;j++){
if(a%j==0)
a1[i]=j;break;
}
}
//求b的公约数存入b1[N]中
for(i=0;i<=b;i++){
for(j=1;j<b;j++){
if(b%j==0)
b1[i]=j;break;
}
}
//判断a与b谁小,设置中间变量去存入该值
if(a>b)
tem=b;
else
tem=a;
//求出两个数的公共约数,存入数组c1中
for(i=0;i<=tem;i++){
if(a1[i]==b1[i])
c1[i]=b1[i];//这可能会造成一些内存的浪费,但关系不大
}
//求公约数数组c1的最大值
max=c1[0];
for(i=0;i<tem;i++){
if(c1[i]>max)max=c1[i];
}
printf("%d与%d的最大公约数为%d",a,b,max);
}
这个代码乍一看,好像还有一点道理,但是,在实际运行的时候,出现了max是类似于一个手机号码的结果(我只用小于100的数初步测试)一眼就感觉不对,但自己又陷入思维定势。
分析问题
自己分析了,一下感觉代码挺正确的,无奈,只好借助gpt大哥,一顿分析,得到两个问题,
问题一,
数组a1,数组b1,数组c1,没有被初始化就使用了,在未被赋值的数组的位置,就出现了随机数,如果,数组所有的位置都能有其对应的值的话,那估计关系也不大,但是如果有实际数组位置没有被赋值的话,计算机就会自动的赋一个随机数上去。
问题二,
明明是一个for就能解决的问题,偏偏复杂化,反而出现问题。
具体问题代码示例(以a1数组举例,其实b1,c1数组也是同样的问题)
//将a的公约数存入,a[N]中,
for(i=0;i<=a;i++){
for(j=1;j<=a;j++){
if(a%j==0)
a1[i]=j;break;
}
}
解决问题
解决办法就是根据具体的问题,提出具体的解决办法
针对于问题一
数组在使用前初始化(以a1数组举例,其实b1,c1数组也是同样的办法)
for(i=0;i<N;i++){
a1[i]=0;
}
针对于问题二
改成为一个for循环即可
for(j=1;j<=a;j++){
if(a%j==0)
a1[j]=j;
}
最终代码
// 3、编写程序求两个正整数的最大公约数。
#include<stdio.h>
#define N 100
int main(){
int a,b,i,j,max,tem;
int a1[N],b1[N],c1[N];
//输入a,b的值
printf("输入a,b的值");
scanf("%d,%d",&a,&b);
//将a的公约数存入,a[N]中,
/* for(i=0;i<=a;i++,j++){
for(j=1;j<=a;){
if(a%j==0)
a1[i]=j;break;
}
}
//第一阶段代码,两个for循环之间,重复循环,一直在1处死循环,
*/
for(i=0;i<N;i++){
a1[i]=0;
}
for(j=1;j<=a;j++){
if(a%j==0)
a1[j]=j;
}
//下面的代码还是有这几个问题,第一,数组没有被初始化,这样会在数组多余无意义的位置
//会出现随机数 解决办法 使用数组前 数组初始化
//初始化数组b1
for(i=0;i<N;i++) {
b1[i]=0;
}
//求b的公约数存入b1[N]中
/* for(i=0;i<=b;i++){
for(j=1;j<b;j++){
if(b%j==0)
b1[i]=j;break;
}
}*/
//改变原来代码,原来代码问题,导致代码一直在b1[j]总是等于1,
//解决办法就是,直接使用一个for循环就可以完成目标任务
for(j=1;j<b;j++) {
if(b%j==0)
b1[j]=j;
}
//判断a与b谁小,设置中间变量去存入该值
if(a>b)
tem=b;
else
tem=a;
printf("两个数的小值为%d\n",tem);
for(i=0;i<N;i++) {
c1[i]=0;
}
//求出两个数的公共约数,存入数组c1中
for(i=0;i<=tem;i++){
if(a1[i]==b1[i]&&a1[i]!=0)
c1[i]=a1[i];//这可能会造成一些内存的浪费,但关系不大
}
//求公约数数组c1的最大值
max=c1[0];
printf("max的初始值%d\n",max);
for(i=0;i<=tem;i++){
if(c1[i]>max)max=c1[i];
//printf("每一次的最大值%d/n",max);
}
printf("%d与%d的最大公约数为%d",a,b,max);
}
总结
还是要多写多练啊,