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

标签 c function recursion primes stdio

我想问一下我对C语言的以下误解,我看到了。

如果代码缩进不正确,我很抱歉,我已经尽力尝试了,但互联网上没有那么多指南。

程序要求给定一个起始数“val”和一个奇偶交替序列(只要违反此规则就会停止)以打印带有“val”的更大素数。

我尝试使用两个函数和主要函数:一个用于控制两个给定数字之间的 GCD,另一个用于跟踪最大的一个,但我认为我在代码或 C 函数的概念中遗漏了一些东西,

因为在编译时它会返回 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;
}

附言。有什么办法可以减少代码行数或者减少编码的工作量吗?我的意思是,直接的解决方案会有所帮助。

最佳答案

您的 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,除非参数 b 是 1。因为我不知道 mcd() 的目的是什么,我无法告诉您如何修复它。它似乎是欧几里德最大公约数算法的一个错误实现,正确实现的是:

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

但我看不出这与:

"[...] he greatest integer prime with 3 [...]

奇数/偶数/偶数/奇数序列处理可以大大简化到比您的方法(根据要求)更短和更简单的程度——这样它就可以工作了!

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

#include <stdio.h>
#include <stdbool.h>

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

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

int main()
{
    int val, x, t ;
    printf( "Enter value:") ;
    scanf("%d", &val);

    typedef enum 
    {
        EVEN = 0,
        ODD = 1,
        UNDEFINED
    } eOddEven ;

    eOddEven expect = UNDEFINED ;
    bool sequence_valid = true ;

    printf( "Enter sequence in odd/even or even/odd order (break sequence to exit):\n") ;
    while( sequence_valid )
    {
        scanf("%d", &x);
        if( expect == UNDEFINED )
        {
            // Sequence order determined by first value
            expect = (x & 1) == 0 ? EVEN : ODD ;
        }
        else
        {
            // Switch expected odd/even
            expect = (expect == ODD) ? EVEN : ODD ;

            // Is new value in the expected sequence?
            sequence_valid = (expect == ((x & 1) == 0 ? EVEN : ODD)) ;
        }

        //  If the sequence is valid...
        if( sequence_valid )
        {
           // Test if input is largest qualifying value
           t = valuta( val, x, t ) ;
        }
    }

    // Result
    printf("Result: %d\n", t);

    return 0;
}

关于c - 了解在另一个 C 中调用一个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53132501/

相关文章:

function - OCaml:迭代列表并跳过错误构造函数的元素

c++ - 将 nullptr 传递给 C 函数是否安全?

c - 将用户输入获取到动态数组 C 时出现问题

excel - 在列中查找唯一值并使用 VBA 代码将它们连接到一个单元格中(从开头和结尾删除空白以避免重复)

javascript - 比较对象并提取深度差异

C 递归函数

c++ - 递归下降解析和语法树

c - Intel x86 到 ARM 汇编转换

c - 那么由 socketpair() 生成的套接字可以在不同的进程中使用吗?

javascript - 如何为隐藏 JavaScript 函数添加 1 秒延迟