学校的新图书馆开门了,看到了不少好书,尤其是两本我一直瞻仰的好书 :《计算机程序设计艺术》TAOCP和编程珠玑。遂开始了我的读书计划,每天读一张TAOCP,也就是采用CR阅读法,每天一点点,不计算我能读完的那一天,力求能够多读一点。
前几天读完了1.1节,说是读完了,其实最后的Knuth大神用集合论证明算法那段看不动,跳过。我也就是只能把书中的欧几里得算法1.1E用C++写了出来,包括习题中那个欧几里得算法算法F,调试了一下,效率果然是好了不少。习题中的算法F虽很小,但我实在是想不出来~~
附上算法1.1E和1.1F及我写的C++源代码:
1.1E: (欧几里得算法)给定两个正整数m和n,求它们的最大公因子.
E1: [求余数]以n除m并令r为所得余数.
E2: [余数为0?]若r=0,算法结束,n即为答案.
E3: [减少]置m<-n,n<-r,并返回E1.
C++:
//TAOCP:1.1E(欧几里得算法)求两个正整数的最大公约数
#include
using namespace std;
int main()
{
int m,n;//两个正整数
int r;//余数
cout<<"请输入两个正整数:"<
cin>>m>>n;
while(0!=(r=m%n))//求余数并判断是否为0
{
m=n;
n=r;
}
cout<<"两个正整数的最大公约数是: "<
<
return 0;
}
算法F:(欧几里得算法)给定两个正整数m和n,求它们的最大公因子.提高效率
F1: [余数为m/n]以n除m并令m是余数.
F2: [它为0?]如果m=0,则此算法结束以n为答案而终止.
F3: [余数为n/m]以m除n并令n是余数.
F4: [它为0?]如果n=0,则此算法结束以答案m而终止,否则返回F1.
C++:
//TAOCP:1.1F(习题,改编欧几里得算法)
//求两个正整数的最大公约数,要求不使用替换(如m=n)
#include
using namespace std;
int main()
{
int m,n;//两个正整数
bool tag;
int count = 1;//记录循环次数
cout<<"请输入两个正整数:"<
cin>>m>>n;
while(1)
{
count++;
m = m % n;
if(m == 0)
{
tag = 1; break;
}
n = n % m;
if(n == 0)
{
tag = 0; break;
}
}
cout<<"两个正整数的最大公约数是: "<<(tag == 1 ? n : m)<
cout<
<
return 0;
}