【发布时间】:2018-11-03 14:58:26
【问题描述】:
想请教以下对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;
}
PS。有什么方法可以减少代码行数或减少编码工作量?我的意思是,一个简单的解决方案会很有帮助。
【问题讨论】:
-
您的函数
valuta有缺陷,因为每次调用它时,变量temp将始终为零。 -
在一个不相关的注释上,你的缩进不是很好,而且你的大括号定位非常不寻常,不能跟随缩进(结束
}跟随缩进通常会使更容易阅读和查看块何时结束)。 -
这里有问题吗!?我建议将问题简化为 1)您打算发生的事情,2)实际发生的事情。相反,您做出了一些疯狂的假设,即问题(无论是什么)与对函数调用的一些误解有关。一般来说,最好不要试图提出问题所在。这里对隐含问题的唯一合理答案是您的函数调用和定义是完全有效的,并且您对此没有任何问题。但这并不能真正解决您的问题吗?
-
您的代码接受用户输入 - 如果您包含一些示例输入、预期结果和实际结果,将会有所帮助。输入没有提示,不清楚什么时候输入什么值。您对这段代码用途的描述完全不清楚。
-
例如 "greatest integer prime with 3" 是什么意思?
标签: c function recursion primes stdio