首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >卡蒂斯-问题:建造金字塔-为什么这不正确?

卡蒂斯-问题:建造金字塔-为什么这不正确?
EN

Stack Overflow用户
提问于 2022-01-27 09:58:20
回答 2查看 399关注 0票数 1

我试图在这里用C#:https://open.kattis.com/submissions/8340306解决这个问题(编辑:下面的完整问题)

所以,简而言之:给予是一堆砖块。目的是想弄清楚,我能用这些区块建造一个三维金字塔有多高。顶层有1块砖,第2层从前9块砖,第3层25块等等。

我想我解决了这个问题,用这个例子来说是正确的。在我所做的所有计算中也是正确的。然而:从5个样本-运行,其中只有例外,在3。

编辑--完整的问题是:当启动一个更大的项目时,比如建造金字塔,最好三思而后行。你今天的任务是编写一个程序,计算给定一定数量的石块可以建多高的金字塔。

我们假定要建造的金字塔是紧凑的,即里面没有空腔。此外,我们假设它是根据图1中的原理构建的,每一层都是方形的,其边长比下面的一层短两倍。顶层总是由单个块组成。。

如果你有剩余的区块,只要你建立一个完整的金字塔,这是好的。

输入第一行输入包含整数N (1≤N≤100000000),即可用的块数。

输出输出一个整数--可以用至少N个块构建的金字塔的最大高度。

我解决方案的结果是:

这是我的代码--请轻点,我只是在学习:)

代码语言:javascript
运行
复制
    public static void Main()
    {
        int bloecke = int.Parse(Console.ReadLine());
        int neueBloecke = 1; // Bloecke, die für die neue Ebene benötigt werden
        int sumBloecke = 1; // Blöcke in Summe
        int seitenLaenge = 1; // Seitenlänge der Ebene
        int ebene = 1; // Auf welcher Ebene wir uns aktuell befinden

        while (sumBloecke < bloecke)
        { 
            // Wenn wir weniger als 10 Blöcke haben, brauchen wir gar nicht anzufangen > wir haben 1 Ebene
            if (bloecke < 10)
            {
                ebene = 1;
                break;
            }

            // Andernfalls legen wir los
            seitenLaenge += 2;
            neueBloecke = seitenLaenge * seitenLaenge;
            sumBloecke += neueBloecke;

            if (sumBloecke>=bloecke)
            {
                break;
            } else
            {
                ebene++;
            }

        }

        Console.Write(ebene);

    }
EN

回答 2

Stack Overflow用户

发布于 2022-01-27 13:48:09

看上去你只是想让它发挥作用。您已经用没有真正目的的代码将它复杂化了,现在它令人困惑。

您的循环有两个退出条件,而只有一个条件是必需的,您的ebene = 1在那里没有任何原因,等等。

你走错路了。如果您只处理代码,直到它适用于您正在应用的任何测试,那么您将永远无法确信它适用于您没有测试的东西。

你需要向自己证明这是正确的。试着做这样的事情:

  • 确保在循环的顶部,块总数、基区域和边缘长度对于金字塔大小ebene+1是有效的。(如果金字塔所需的块总数大于invariant)
  • Exit增量ebene,并计算下一个大小的变量和循环.

,则称为循环ebene)。

如果您实现了这个简单的过程,那么您将确信结果是正确的。

票数 1
EN

Stack Overflow用户

发布于 2022-01-28 11:09:22

这对我来说很管用:

代码语言:javascript
运行
复制
public static void Main()
{
    int availableBlocks = int.Parse(Console.ReadLine());
    int newBlocks = 0; // blocks for the new level
    int sumBlocks = 0; // sum of used blocks
    int edgeLength = 0; // blocks on one side of the level
    int level = 0; // which level are we

    while (true)
    {
        // e.g. availableBlocks = 15
        //
        // edge | new | sum | ok? | level
        // 0      0     0     yes   0
        // 1      1     1     yes   1
        // 3      9     10    yes   2
        // 4      16    26    no    -

        // edgeLength increases by 2, except for the first top-level
        if (edgeLength==0)
        {
            edgeLength++;
        } else
        {
            edgeLength += 2;
        }

        newBlocks = edgeLength * edgeLength;
        sumBlocks += newBlocks;

        // Check, if we still have enought blocks
        if (sumBlocks <= availableBlocks)
        {
            level++;
        } else
        {
            Console.WriteLine(level);
            break;
        }
    }
}```
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70876569

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档