早觉得需要开始学学C++了,我的编程水平一直停留在高中阶段,现在是改变的时候了。
于是翻老谭C++教材的函数部分,开始做题,第一题让求最大公约数。
初中写过一个类似的小算法,在WQX上面的GVBASIC实现了自动化简分子分母,不过辗转相除显然效率更高。
A=q*B+c
辗转相除有多种实现方法,循环结构,递归都可以。
第一次实验程序:
#include <iostream>
#include <cmath>
using namespace std;
void main()
{
int gcd(int a,int b);
int lcm(int a,int b);
int a,b,temp;
cin >>a>>b;
if (a<b) {temp=a;a=b;b=temp;} else if (a=b) cout <<"equal";
cout <<gcd(a,b);
}
int gcd(int a,int b)
{
int r;
if (b!=0) {r=a%b;gcd(b,r);}
else
return(a);
}
这个代码用Visual C++ Express Edition编译通过,执行结果正确。
但是这时cq提示我说,有明显错误,最后一次调用之前,gcd是没有返回值的。
然后他随意写了个程序
int comp(a,b)
{
if(a>b){m(a,b);s(a,b);}
else return b;
}
int m(a,b}{return a;}
int s(a,b){return b;}
comp(5,3)
我修改修改编译完成,发现一个很玄幻的现象。返回值是3。
cq:“微软害死程序员啊'‘= =、
然后让我调整编译器警告级别,但是我没有找到选项。
翻书复习了一下递归知识,终于明白问题所在,最终程序如下。
#include <iostream>
#include <cmath>
using namespace std;
void main()
{
int gcd(int a,int b);
int lcm(int a,int b);
int a,b,temp;
cin >>a>>b;
if (a<b) {temp=a;a=b;b=temp;} else if (a==b) cout <<"equal";
cout <<gcd(a,b);
}
int gcd(int a,int b)
{
int r;
if (b!=0) {r=a%b;return(gcd(b,r));}
else
return(a);
}