【问题标题】:C product of three consecutive numbers三个连续数字的 C 乘积
【发布时间】:2015-12-15 02:50:44
【问题描述】:

我试图解决这个棘手的问题,但由于某种原因,我的代码做错了什么……我不完全知道为什么,但我会尽可能多地解释。

连续产品: 编写一个读取正整数的程序 来自标准输入并验证它是否等于三的乘积 自然数和连续数。例如,数字 120 等于 到 4x5x6,至于数字 90 没有任何三个连续的自然 乘积为 90 的数字。您的程序应生成输出 'S' 如果有 3 个连续自然数的乘积是 读取的值,如果没有,则为“N”。

Input

120

Expected Output

"S"


Input

60

Expected Output

"S"


Input

80

Expected Output

"N"


Input

120

Expected Output

"S"

这是我的代码:

 #include <stdio.h>
int main(){
    int int1,i,count=10,j,k,w=0;
    scanf("%i",&int1);
    for (i = 1; i <= count; ++i)
    {
        for (j = 1; j <= count+1; ++j)
        {
            for ( k = 1; k <= count+2; ++k)
            {
                if ((i==j+1 && i==k+2) && (i*j*k==int1)){
                    w=1;
                }
            }
        }
    }
    if (w==0)
    {
        printf("N");
    }
    else{
        printf("S");
    }
}

所以基本上这样做是我有 3 个循环,它们将以k*i*j 形式生成随机数...并检查我们是否得到了我们想要的(三个自然数和连续数的乘积)。这是作业。

【问题讨论】:

  • 您的过程似乎无效,请尝试查找素因数,然后检查是否可以使用不同的倍数组合找到连续数字。
  • 问题是什么?
  • 您希望您的程序不输出什么?它似乎适用于您提供的示例。
  • 是的,我知道,这正是我很困惑的原因......

标签: c algorithm loops


【解决方案1】:

您可能想在这个问题上添加算法标签。也就是说,我的方法是考虑 3 个连续数字的乘积。你可以把它写成 x * (x+1) * (x+2)。但是有更好的方法。

将其写为 (x-1) * x * (x+1)。然后乘法和简化。结果是 x^3-x。

现在对于任何给定的数字,从 x = 2 在 x 上开始一个循环(因为如果 x=1 则 x-1=0 并且这永远不会是一个解决方案)并在每个循环中递增 1。检查每个循环是否与输入数字匹配。如果匹配,则返回 true。如果它不匹配并且超过输入的数字,则返回 false。如果不匹配且小于输入数,则再次循环。

【讨论】:

  • 为了进一步改进,可以解方程x^3 -x = num 并查看结果是否为整数。那将是 O(1) 解决方案。
【解决方案2】:

您不需要 3 个循环。一种简单的方法是:

int test(int num)
{
    for (int i = 1; i < num; i++)
    {
        int product = i * (i + 1) * (i + 2);
        if ( product == num )
            return true;
        else if (product > num)
            break;
    }
    return false;
}

【讨论】:

  • 你声明变量的方式只对C++是正确的,对吧?
  • 它可能适用于 C99 :)。开玩笑,我来自 C++ 背景,因此根据需要声明了变量。但说真的,在 C99 中,它们是合法的。 en.wikipedia.org/wiki/C99
  • 如果乘法溢出,此代码可能会产生不准确的结果,如果 num 大于产生 S 输出并适合数据类型的最大数字,则会产生不准确的结果。
  • @KlasLindbäck 我查看了您的案例,但找不到此代码如何产生不准确的结果。测试 product==num 仍然有效,因此将 N 识别为 S 没有任何变化。循环由 for 条件 (i num) 终止。 (现在如果负 num 是另一回事,但我假设调用者抓住了那个条件:))你能详细说明代码是如何破坏的吗?
  • 对于高num,产品会溢出。鉴于大多数编译器如何处理溢出,乘积将变为负数。然后随着i 变大,产品将再次变为正值,并且可能恰好变成num。尝试使用num=139154728,它不应该为i=2058 返回true,但它确实(假设32 位int)。 2058*2059*2060 的实际值是 8729089320,不适合 32 位整数。
【解决方案3】:

我修改了你的代码。如果问题仍然存在,请告诉我。所做的更改正如 WDS 所说。

#include <stdio.h>
int main(){
int int1,i,count=10,j,k,w=0,comp;
scanf("%i",&int1);
for (i = 1; i <= count; ++i)
{
    comp = i*(i+1)*(i+2);
    if(comp==int1)
    {
        w = 1;
    }
}
if (w==0)
{
    printf("N");
}
else
{
    printf("S");
}
return 0;
}

【讨论】:

  • 此代码不会按原样工作,但它是一种无需说出最终答案即可提供提示的好方法
猜你喜欢
  • 1970-01-01
  • 2014-02-27
  • 2020-08-11
  • 2021-03-09
  • 1970-01-01
  • 2016-10-12
  • 1970-01-01
  • 2019-06-29
  • 1970-01-01
相关资源
最近更新 更多