记录一次C语言编程的很低级的错误及如何复盘代码,解决问题

问题出现背景

        今天刚好在练习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);
}

总结

     还是要多写多练啊,

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

deadline是第一生产力,

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值