读了一点TAOCP.《计算机程序设计艺术》

学校的新图书馆开门了,看到了不少好书,尤其是两本我一直瞻仰的好书 :《计算机程序设计艺术》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;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值