程序流程,结果展示及心得
本次程序设计并不难,由于时间和能力问题,并未将三个算法写成一个程序,而是分成三个程序写,固有三个流程图。
第一个 :辗转相除法
#include<stdio.h>
#include<math.h>
int main()
{
int a,b,c,t;
printf("请输入要求最大公约数的两个数");
scanf("%d%d",&a,&b);
if(a>b)
c=a%b;
else
{
t=a;
a=b;
b=t;
c=a%b;
}
if(c==0)
printf("最大公约数为%d\n",b);/* 因为前面交换过a,b的值所以此处输出b*/
else
{
while(c!=0)
{
c=a%b;
a=b;
b=c;
}
printf("最大公约数为:%d\n",a);/*因为最后一次循环时把c的值赋给b,b的值赋给a,故此处应该输出a短的值*/
}
return 0;
}
心得:
刚开始编程时没有考虑到c直接等于0的情况,所以输入两个可以整除的整数余数为0,输出结果就为0,后来发现只有在前面的数大,后面的数小的时候才能正常运行,所以加了if条件,使得a始终大于b,最终保证程序的正常运行。
第二个 :更相减损法
#include<stdio.h>
#include<math.h>
int main()
{
int a,b,c;
printf("请输入两个数");
scanf("%d%d",&a,&b);
while(c!=0)
{
c=sqrt((a-b)*(a-b));/*如果a b之间的大小没有确定就有可能减出负数,因为判断大小的情况太多,所以直接取绝对值,直到减为0为止*/
a=sqrt(b*b);
b=sqrt(c*c);
}
printf("最大公约数是:%d\n",a);
return 0;
}
心得:
同之前一样,开始时未考虑到a,b,c之间的大小关系,很容易减出负数或者无输出结果,考虑到加if判断条件太多,语句也比较长,故所有的值都取绝对值,这样一来直到减为0为止,方便了很多。
第三个 :穷举法
#include<stdio.h>
int main()
{
int a,b,i;
printf("请输入两个需要求最大公约数的数");
scanf("%d%d",&a,&b);
for(i=a;i>0;i--)
{
if(a%i==0&&b%i==0)
break;
}
printf("最大公约数是%d\n",i);
return 0;
}
心得:
用while 语句未能实现正确运算,故改用for循环,很简单的实现了遍历。