1

为清晰起见而编辑。我为混乱道歉:3

好的,所以我正在上一个在线 CS 课程,我们应该用 C 语言编写一个程序,它会告诉你如果你在月初有一个便士并将其翻倍,你会有多少钱每天。

每一天,你都会得到昨天的两倍加上前几天的一切。

示例:您从 0.01 开始,然后在第 3 天计算运行总计。所以第一天是 0.01,第二天是 0.02,第三天是 0.04。在第 3 天,您将获得 0.01+0.02+0.04 (.09)。

该程序打算在任何给定月份(28 - 31 天)的持续时间内计算此过程。

我很难实现这一点。我已经把它加倍了,但我不确定如何将之前计算的天数加在一起。

这是我的代码:

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

int main(void) {

    /*days represents total days in months*/
    /*pens represents the number of pennies on the first day*/

    long long days;
    long long pens;

    do {
      printf("Enter the number of days in the month: ");
      scanf("%llu", &days);
    } while(days < 28 || days > 31);    

    printf("Enter the initial number of pennies: ");
    scanf("%llu", &pens);

    for (int i=0; i<= days-1; i++) {
      pens += pow(2,i);
      printf("You'll have $%llu\n", pens);
    }
}

edit2:好的,所以我想我已经修复了它,这要感谢你所有的真棒建议。我将最后一部分更改为:

for (int i=0; i<= days-1; i++)
        {
            pens = pens + (pens * 2);

        }
        total = pens / 100;
        printf("You'll have $%.2f\n", total);

    } 

虽然输出仍然存在一个小问题(我在想,这是由于我使用的数据类型造成的?)它打印出来:

您将获得 0.00 美元 您将获得 0.00 美元 您将获得 0.00 美元 您将获得 0.00 美元 您将获得 2.00 美元 您将获得 7.00 美元 您将获得 21.00 美元、您将获得 65.00 美元 您将获得 196.00 美元、您将获得 590.00 美元您将获得 $1771.00 您将获得 $5314.00 您将获得 $15943.00 您将获得 $47829.00 您将获得 $143489.00 您将获得 $430467.00 您将获得 $1291401.00 您将获得 $3874204.00

等等

相当不错,但我打赌它不是那么准确,因为前几次迭代是 0.00。

4

4 回答 4

5

好吧,让我们把你必须做的事情翻译成伪代码:

var daily_amount = 0.01
var total = daily_amount

iteration_over_days:
    daily_amount *= 2
    total += daily_amount

从那里,您需要做的就是翻译成 C。

享受!

除了使用long数据类型,您还可以从 1 开始,然后在末尾除以 100:$0.01 -> $1

于 2012-09-10T06:00:45.433 回答
0

我认为以下行需要更改:

pens+=pow(2,i);

它应该是:

pens = pens + (pens * 2)

逻辑是,如果您在第 1 天以 1 便士开始,那么它将是这样的

第 1 天:1 + (1 * 2) = 3
第 2 天:3 + (3 * 2) = 9
第 3 天:9 + (9 * 2) = 27
以此类推..

我希望这是您所期望的逻辑。通过执行 pow(2,i),您只是将每日计数的平方添加到您每天的总金额中,这似乎不是基于您的问题的预期逻辑。

于 2012-09-10T05:58:33.293 回答
0

不要每次都计算功率!只需跟踪运行计数并每天加倍。

这是您需要total_days天数的算法的核心:

typedef unsigned long long int my_uint;

my_uint initial_payment = 1;
my_uint total_pennies = 0;

for (my_uint day_payment = initial_payment, day = 0; days != total_days; ++day)
{
    total_pennies += day_payment;
    day_payment *= 2;
}

// now have total_pennies

当然你会注意到 1 +  q  +  q 2  +  q 3  + ... +  q N  - 1与 ( q N  - 1) / ( q  - 1) 相同,因此只需一步即可计算出答案 (例如,在您的情况下q = 2 和N天)。

于 2012-09-10T05:59:16.353 回答
0

这是您正在查看的代码:

total = 0;
for (int i = 1; i <= days; i++) {
     total += pens;
     pens = pens*2;
}
printf("You'll have $%d\n", total);
于 2012-09-10T05:59:36.097 回答