zoukankan      html  css  js  c++  java
  • 老调重弹

    有时候一个函数需要返回多个结果,而C++98并不提供对它的支持,这时候有两种办法:把要返回的结果设为全局变量,或者把多出的结果作为参数按引用传递(C#的out关键字就是这个作用)。

    拿扩展欧几里德算法举例吧,输入a、b,求出x,y,g,使得a*x+b*y=g且g=gcd(a,b)。两种写法如下:

    int x,y,g;
    void exgcd(int a, int b)
    {
        if(!b)
        {x = 1; y = 0; g = a;}
        else
        {
            exgcd(b, a%b);
            int t = x;
            x = y;
            y = t - a/b * y;
        }
    }
    int exgcd(int a, int b, int &x, int &y)
    {
        if(!b)
        {
            x = 1;
            y = 0;
            return a;
        }
        int g = exgcd(b, a%b, y, x);//注意此处,x与y位置交换
        y -= a/b*x;
        return g;
    }

    第一种写法在竞赛中还可以,工作中是不能乱用全局变量的;第二种写法虽然看起来简单一些,但是不容易看懂。这个算法的核心是:outX = innerY; outY = innerX-a/b*innerY。第二种写法第一眼看上去完全不一样。

    以前搞ACM的时候,越是让别人看不懂越有bigger,搞工程的时候可不能这样了,应该是让别人都能看懂。好在C++11引入了tuple,可以很好地解决返回多个值的问题,用它重写的函数是这样的:

    // C++11 version
    tuple<int,int,int> exgcd(int a, int b)
    {
        if(0 == b)
            return make_tuple(1, 0, a);
        int x, y, g;
        tie(x, y, g) = exgcd(b, a%b);
        return make_tuple(y, x - a/b * y, g);
    }

    这种写法思路比前两种都清晰。

    到了C++17有了Structured binding,可以更方便地给多个变量赋值,于是写法可以更简洁一些

    // C++17 version
    array<int,3> exgcd(int a, int b)
    {
        if(0 == b)
            return {1, 0, a};
        auto [x, y, g] = exgcd(b, a%b);
        return {y, x - a/b * y, g};
    }
  • 相关阅读:
    EasyUI限制时间选择(开始时间小于结束时间)
    C# readonly与const的区别
    C# Lambda 表达式
    C# 扩展方法
    C# 枚举enum
    Visual Studio中的“build”、“rebuild”、“clean”的区别
    无root开热点教程
    数据库锁
    安卓:标题栏右上角添加按钮
    安卓:从assets目录下复制文件到指定目录
  • 原文地址:https://www.cnblogs.com/lzxskjo/p/5296784.html
Copyright © 2011-2022 走看看