假设我们有n只大羊驼.每年,n/3只新的大羊驼出生,n/4只大羊驼死go .

例如,如果我们从n=1200只大羊驼开始,那么在第一年,1200/3=400只新的大羊驼将诞生,1200/4=300只大羊驼将死go .到那年年底,我们将有1200+400-300=1300只大羊驼.

#include <math.h>
#include <stdio.h>

int main(void)
{
    // TODO: Prompt for start size
    int a, b;
    do
    {
        printf("Start Size: ");
        scanf("%i", &a);
    }
    while (a < 9);
    // TODO: Prompt for end size
    do
    {
        printf("End Size: ");
        scanf("%i", &b);
    }
    while (b < a);
    // TODO: Calculate number of years until we reach threshold
    int y = 0;
    while (a < b)
    {
        a = round((float)a + (a / 4) - (a / 3));
        y++;
    }

    // TODO: Print number of years
    printf("Years: %i\n", y);
}

我try 的输入和我预期的输出:

  1. 起步规模:1200
    结束尺寸:1300
    年份:1

  2. 起始大小:-5
    起始大小:3
    起始大小:9
    结束尺寸:5
    结束尺寸:18
    年份:8年

  3. 起始大小:20
    结束大小:1
    结束尺寸:10
    结束尺寸:100
    年份:20年

  4. 起始规模:100
    结束尺寸:1000000
    年份:115年

推荐答案

公式不正确:你调换了新生的大羊驼和死go 的大羊驼的数量.此公式收敛到0,一旦a达到0和2之间的值并且不再更改,就会导致无限循环.

写下这句话:

a = round((float)a + (a / 3) - (a / 4));

注意,你应该使用简单的整数运算,因为新的大羊驼和死的大羊驼的数量都是整数.由于int中为a,因此a / 3a / 4也是如此,因此不需要(float)强制转换或round()函数调用:

a = a + a / 3 - a / 4;

或者更简单:

a += a / 3 - a / 4;  

另请注意,您应该测试返回值scanf(),以避免在输入无效或丢失时出现未定义的行为.

以下是修改后的版本:

#include <stdio.h>

int main(void)
{
    // Prompt for start size
    int a, b;

    for (;;) {
        printf("Start Size: ");
        if (scanf("%i", &a) != 1) {
            int c;
            printf("invalid input\n");
            while ((c = getchar()) != EOF && c != '\n')
                continue;
            if (c == EOF)
                printf("unexpected end of file\n");
                return 1;
            }
            continue;
        }
        if (a < 9) {
            printf("value must be at least 9\n");
            continue;
        }
        break;
    }

    // Prompt for end size
    for (;;) {
        printf("End Size: ");
        if (scanf("%i", &b) != 1) {
            int c;
            printf("invalid input\n");
            while ((c = getchar()) != EOF && c != '\n')
                continue;
            if (c == EOF)
                printf("unexpected end of file\n");
                return 1;
            }
            continue;
        }
        if (b < a) {
            printf("value must be at least %d\n", a);
            continue;
        }
        break;
    }

    // Calculate number of years until we reach threshold
    int y = 0;
    while (a < b) {
        a += a / 3 - a / 4;
        y++;
    }

    // Print number of years
    printf("Years: %i\n", y);
    return 0;
}

由于您正在学习CS50课程,因此您应该使用<cs50.h>中的函数get_int()以方便的方式简化错误处理:

#include <cs50.h>
#include <stdio.h>

int main(void)
{
    // Prompt for start size
    int a, b;

    while ((a = get_int("Start Size: ")) < 9) {
        printf("value must be at least 9\n");
    }

    // Prompt for end size
    while ((b = get_int("End Size: ")) < a) {
        printf("value must be at least %d\n", a);
    }

    // Calculate number of years until we reach threshold
    int y = 0;
    while (a < b) {
        a += a / 3 - a / 4;
        y++;
    }

    // Print number of years
    printf("Years: %i\n", y);
    return 0;
}

C++相关问答推荐

为什么已经设置的值在C中被重置为for循环条件中的新值?

为什么我得到更多的256假阳性在PKZIP解密密钥验证?

当多个线程在C中写入相同的文件描述符时,如何防止争用情况?

使用GOTO从多个嵌套循环C继续

如何使用低级C++写出数值

如何在不使用其他数组或字符串的情况下交换字符串中的两个单词?

如何在STM8项目中导入STM8S/A标准外设库(ST VisualDeveloper)?

这个计算C中阶乘的函数正确吗?

一旦运行长度超过2,编译器是否会优化";strnlen(mystring,32)>;2";以停止循环?

使用ld将目标文件链接到C标准库

有没有一种方法可以用C创建保留限定符的函数?

如何摆脱-WIMPLICIT-Function-声明

*S=0;正在优化中.可能是GCC 13号虫?或者是一些不明确的行为?

即使我在C++中空闲,也肯定会丢失内存

将某些内容添加到链接列表时,列表中的其他项将使用最后添加的项的名称

程序如何解释变量中的值

Makefile无法将代码刷新到ATmega328p

在C中,为什么这个带有递增整数的main函数从不因溢出而崩溃?

使用 c 中的 write() 函数将非 ASCII 字符写入标准输出

std::malloc/calloc/realloc/free 与纯 C 的 malloc/calloc/realloc/free 有什么不同