了解在另一个C中调用一个函数

时间:2018-11-03 14:58:26

标签: c function recursion primes stdio

我想问一下我对C语言的以下误解。

很抱歉,如果代码缩进不正确,我会尽我所能,但是互联网上没有太多指南。

程序要求给定一个起始数字'val'和一个偶-奇或奇/偶交替序列(只要违反此规则,该序列就会停止),以显示带有'val'的较大质数。

我尝试了两个函数和主要函数:一个在两个给定数字之间控制GCD,另一个则跟踪最大的数字,但是我想我在代码或C函数的概念中错过了一些东西,< / p>

因为编译后它会返回0或我没有输入的大量数字。

了解我应该做什么的一个示例:

如果我的序列是10、7、8、23,而val是3,则我必须打印23,因为它是3的最大整数素数。

这是代码:

#include <stdio.h>
int mcd(int a, int b)
{   // Gcd function
    if (a == 0)
        return b;
    else
        return mcd(b % a, b);
}

int valuta(int val, int h)  // Valuing Max function
{
    int temp = 0;
    if (mcd(val, h) == 1 && h > temp)
        temp = h;
    return temp;
}

int main()
{
    int val, d, x, y, z, t, contatore = 1;
    scanf("%d", &val);
    scanf("%d%d", &x, &y);
    if (x > y && mcd(val, x) == 1)
    {   // Two options
        t = x;
    }
    else if (y > x && mcd(val, y) == 1)
    {
        t = y;
    }
    if ((x % 2 == 0 && y % 2 == 0) || (x % 2 == 1 && y % 2 == 1))
    {   // Bad case
        if (x > y && mcd(val, x) == 1)
        {
            t = x;
            contatore = 0;
        }
        else if (y > x && mcd(val, y) == 1)
        {
            t = y;
            contatore = 0;
        }
    }
    else
    {
        while (contatore == 1)
        {
            scanf("%d", &z);
            t = valuta(val, z);
            if (x % 2 == 0 && z % 2 == 0)
            {   // Even- Odd - Even
                scanf("%d", &d);
                t = valuta(val, d);
                if (d % 2 == 0)
                {
                    contatore = 0;
                }
                else
                {
                    contatore = 0;
                }
            }
            if (x % 2 == 1 && z % 2 == 1)
            {   //Odd- Even- Odd
                scanf("%d", &d);
                t = valuta(val, d);
                if (d % 2 == 1)
                {
                    contatore = 0;
                }
                else
                {
                    contatore = 0;
                }
            }
        }
    }
    printf("%d\n", t);
    return 0;
}

PS。有什么方法可以减少代码行数或减少编码工作量?我的意思是,简单的解决方案会有所帮助。

1 个答案:

答案 0 :(得分:0)

您的valuta()函数存在缺陷,因为它需要返回到目前为止的最大合格值,但不知道先前的最大值-temp始终为零。以下将以前的最大值作为参数:

int valuta(int val, int h, int previous )
{
    return ( mcd(val, h) == 1 && h > previous ) ? h : previous ;
}

因此从main()被调用:

t = valuta( val, x, t ) ;

测试mcd(val, h) == 1有缺陷,因为mcd()仅返回未在递归中修改的参数b的值,因此除非参数{{ 1}}是1。由于我不知道b打算做什么,所以我无法告诉您如何解决。这似乎是Euclid最大的除数算法的一个错误实现,正确实现的方法是:

mcd()

但我看不出它与以下内容有何关系:

  

“ [[...]他是3 [...]

的最大整数素数

奇数/偶数/奇数序列处理可以大大简化,以使其比您的方法(根据要求)更短,更简单-并且可以正常工作!

以下是一个更清晰的起点,但由于尚不清楚它应该做什么,因此可能不是解决方案。

int mcd(int a, int b)
{
    if(b == 0)
        return a;
    else
        return mcd(b, a % b);
}