【问题标题】:Multiplying and increasing pows乘以和增加战俘
【发布时间】:2019-05-26 20:40:12
【问题描述】:

想法是这样的:http://prntscr.com/m0xopk,除了 5 外,它工作得很好,当我给 5 时它计算错误。我不明白为什么?

int i,a,n;
int sum = 1;

scanf("%d",&a);
scanf("%d",&n);


for(i = 1;i <= n;i++){
     sum *=pow(a,i);

}
printf("%d",sum);

【问题讨论】:

  • pow 是一个浮点函数,因此与计算机上的所有浮点运算具有相同的问题,并在Is floating point math broken? 中进行了讨论对于整数,我建议您自己编写函数,但要小心溢出。
  • 这是函数之前的作业,所以我没有使用函数,谢谢你的回答
  • 另外请阅读how to ask good questions,以及this question checklist。编辑您的问题,为我们提供导致其失败的完整输入,并告诉我们预期和实际输出。
  • 对于a=5n=5,结果是30517578125,对于32 位int 来说太大了。试试double sum = 1;printf("%f",sum);
  • 你可以避免调用pow,通过从前一个幂计算一个幂:a^n = a^(n-1) * a

标签: c for-loop pow multiplication


【解决方案1】:

除了 5 外,它工作得很好,当我给 5 时它计算错误

不,它非常适用于 小于 的值而不是 5。当您为an 提供输入5 时,总和结果数将为30517578125,这对于32int 类型变量要保持很大。相反,您应该使用uint64_t 类型变量。

此外,您不应将pow() 函数用于整数类型。检查this

你可以这样做:

#include <stdio.h>
#include <inttypes.h>

int main()
{
    int i, a, n;
    uint64_t num = 1, result = 1;;

    printf ("Enter a: \n");
    scanf("%d",&a);
    printf ("Enter n: \n");
    scanf("%d",&n);

    for(i = 0;i < n;i++){
        num = num * a;
        result = num * result;
    }

    printf("result: %"PRId64"\n", result);

    return 0;
}

请注意,此64 位解决方案也有限制,并且适用于输入5,但可能不适用于比5 稍大的数字。如果要任意大的数字,请查看this

【讨论】:

    【解决方案2】:

    整数无法容纳如此大的数字。您需要改用浮点数。

    double calc(double a, int i)
    {
        double sum = 1;
    
        for(int p = 1; p <= i; p++)
        {
            sum *= pow(a,i);
        }
        return sum;
    }
    

    【讨论】:

      猜你喜欢
      • 2019-06-07
      • 2021-03-24
      • 1970-01-01
      • 1970-01-01
      • 2018-06-26
      • 1970-01-01
      • 2014-09-01
      • 1970-01-01
      • 2020-12-27
      相关资源
      最近更新 更多