九章算术
开篇,求最大公约数——辗转相减法
声明三个值
最大值 = X 、最小值为 = Y、商值 = Z
用三个值解决辗转相减法
用最大值减去最小值得到商值,然后去掉原本的最大值,拿原本的最小值与商值作比较,得到第二个最大值与第二个最小值,然后用最大值减去最小值,重复最大值减去最小值,直到最大值等于最小值,也就是他们相减等于0
举个例子
例如两个元素,一个为68,一个为78
最大值为78,最小值为68,那么拿最大值78减去最小值68得到商值10
那么去掉原本的最大值78,拿原本的最小值68与商值10比较
得到第二个最大值为68,第二个最小值10,拿最大值68减去最小值10得到商值58
去掉原本的最大值68,得到第二个最大值58,第二个最小值10,
重复循环第二句去最大值,得新最大值,新最小值,直到他们的最大值等于最小值
58-10=48
48-10=38
38-10=28
28-10=18
18-10=8
10-8=2
8-2=6
6-2=4
4-2=2
2-2=0
得到68与10的最大公约数为2,知道了大概逻辑,用c/c++来写辗转相减
我们知道有最大值和最小值,那么这个最大值,最小值,可以用键盘输入,也可以用常量
第一步
int x,y;
scanf("%d%d",&x,&y);
他们需要判断最大值最小值,然后用最大值减去最小值
第二步
if (x > y)
x -= y;
else
y -= x;
循环这一步直到他们等于零
第三步
do{
if (x > y)
x -= y;
else
y -= x;
} while (x != y);
最后将他们合起来输出
#include <stdio.h>
void main(){
int x,y;
scanf("%d%d",&x,&y);
do{
if (x > y)
x -= y;
else
y -= x;
} while (x != y);
printf("最大值为%d\n",x);
}
因为到最后他们的值是相等的,你在输出选x还y是没有影响的
运行结果
循环只有一个do....while吗
不不不,还有while循环和for循环
for循环仅供参考
#include <stdio.h>
main(){
int x,y;
scanf("%d%d",&x,&y);
for (int z; z > 0; x == y)
{
if (x > y)
x -= y;
else
y -= x;
}
printf("最大公约数为%d\n",x);
}
while循环仅供参考
#include <stdio.h>
main(){
int x,y;
scanf("%d%d",&x,&y);
while (1)
{
if (x > y)
x -= y;
else
y -= x;
if (x == y)
{
break;
}
}
printf("最大公约数为%d\n",x);
}