如何将此伪代码更改为C语法

时间:2012-05-20 02:01:03

标签: c pseudocode

我从维基百科的Euclid扩展算法中找到了这个伪代码,但我不知道如何从函数中返回2个值。

function extended_gcd(a, b)
    if b = 0
        return (1, 0)
    else
        (q, r) := divide (a, b)
        (s, t) := extended_gcd(b, r)
        return (t, s - q * t)

来源: http://en.wikipedia.org/wiki/Extended_Euclidean_algorithm

3 个答案:

答案 0 :(得分:3)

你的问题被标记为C和C ++。

在C中,您实际上无法从函数返回两个值,但有几种方法可以实现相同的效果。

您可以返回struct。例如,请参阅div中声明的<stdlib.h>函数,它返回类型div_t的结果,包含quotrem成员的结构。< / p>

或者你可以通过传递一个指针来间接地“返回”多个结果:

void func(int *result1, int *result2) {
    *result1 = 10;
    *result2 = 20;
}
...
int r1, r2;
func(&r1, &r2);

C ++支持这两种方法,还有其他一些方法。例如,C ++有引用类型; C ++标准库中也有类型,例如std::pair和元组,可以用于此类事情。

但在开始实施之前,您应该决定使用哪种语言。

答案 1 :(得分:2)

模板类std::pair可以用于此;即,

if (b == 0)
    return std::pair<int, int>(1, 0);

答案 2 :(得分:1)

#include <stdio.h>

typedef struct _tuple {
    int fst;
    int snd;
} Tuple;

Tuple tuple(int a, int b){
    Tuple ret = { a, b };
    return ret;
}

Tuple extended_gcd(Tuple x){
    if(x.snd == 0)
        return tuple(1,0);
    else {
        Tuple qr = tuple(x.fst/x.snd, x.fst%x.snd);
        Tuple st = extended_gcd(tuple(x.snd, qr.snd));
        return tuple(st.snd, st.fst - qr.fst * st.snd);
    }
}

int main() {
    Tuple ans = extended_gcd(tuple(120,23));
    printf("(%d,%d)\n", ans.fst, ans.snd);//(-9,47)
    return 0;
}