Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 一系列产品_C++_For Loop_Range - Fatal编程技术网

C++ 一系列产品

C++ 一系列产品,c++,for-loop,range,C++,For Loop,Range,我正试着为这个写一个小循环 其中,Pi是k范围内的参数的乘积(如果你不知道,只是很彻底)。有点像总和符号。不管怎样,我似乎不知道怎么写这个。我已经写了这个小函数,但它不是我想要的。它只是打印(7i-2)的结果超过我指定的范围。这并不是将它们全部相乘,我知道我没有要求它这么做。我甚至不知道如何让它这么做。寻找暗示,不一定是答案(不过,那也不错) 到目前为止我所做的: void prod(long int& num) { for ( int i = 1; i <= 25; +

我正试着为这个写一个小循环

其中,Pi是k范围内的参数的乘积(如果你不知道,只是很彻底)。有点像总和符号。不管怎样,我似乎不知道怎么写这个。我已经写了这个小函数,但它不是我想要的。它只是打印(7i-2)的结果超过我指定的范围。这并不是将它们全部相乘,我知道我没有要求它这么做。我甚至不知道如何让它这么做。寻找暗示,不一定是答案(不过,那也不错)

到目前为止我所做的:

void prod(long int& num)
{
    for ( int i = 1; i <= 25; ++i)
    {
        num =(-1.0)*((7.0*i - 2));

        std::cout << num << std::endl;

    }
}
void prod(长整型&num)
{
对于(int i=1;i
和写这个完全一样

A = A * B;
它将左侧的值乘以右侧的值,并将其指定给左侧的值

您可以对所有数学运算符执行相同的操作:
+=
-=
*=
/=
%=


编辑:请注意,正如
bruce3141
的回答正确指出的那样,
int
long
数据类型在到达
k=25
之前都会导致溢出,因此,就目前而言,尽管此算法是正确的,但由于溢出,它不会在计算机中给出正确的结果。使用浮点像
double
这样的点数据类型实际上不是一个可接受的解决方案。您需要研究一个可以处理大于
long
将存储的整数的类。我不确定
C++
有什么,但您正在寻找与
Java
biginger
类等效的类

和写这个完全一样

A = A * B;
它将左侧的值乘以右侧的值,并将其指定给左侧的值

您可以对所有数学运算符执行相同的操作:
+=
-=
*=
/=
%=



编辑:请注意,正如
bruce3141
的回答正确指出的那样,
int
long
数据类型在到达
k=25
之前都会导致溢出,因此,就目前而言,尽管此算法是正确的,但由于溢出,它不会在计算机中给出正确的结果。使用浮点像
double
这样的点数据类型实际上不是一个可接受的解决方案。您需要研究一个可以处理大于
long
将存储的整数的类。我不确定
C++
有什么,但您正在寻找与
Java
biginger
类等价的类。

<>将
num
初始化为1,然后在
的同时将其放入

num=num*((7.0*i-2));


最后将其乘以
-1

num
初始化为1,然后在
时将其放入

double prod(unsigned int k)
{
    double result = 1;
    for(int i = 1; i <= k; i ++)
    {
        result * = 7*i - 2;
    }
    return -result;
}
num=num*((7.0*i-2));

最后将其乘以
-1

double prod(unsigned int k)
{
    double result = 1;
    for(int i = 1; i <= k; i ++)
    {
        result * = 7*i - 2;
    }
    return -result;
}
编辑:

每个数学表达式(没有未知数)都将始终等于一个值。因此,最好通过使函数返回表达式的值来表示该表达式。返回值使函数比仅将值打印到控制台更易于重用。
例如,我可以做类似于
double x=prod(3)+prod(4);

因为有一个未知值(上限k),所以我将其作为函数的参数,以便代码可以与不同的上限k值一起使用

遵循好的设计模式总是好的,这样可以避免以后通过重新分解代码而浪费时间

编辑:

每个数学表达式(没有未知数)都将始终等于一个值。因此,最好通过使函数返回表达式的值来表示该表达式。返回值使函数比仅将值打印到控制台更易于重用。
例如,我可以做类似于
double x=prod(3)+prod(4);

因为有一个未知值(上限k),所以我将其作为函数的参数,以便代码可以与不同的上限k值一起使用


遵循好的设计模式总是很好的,这样可以避免以后通过重新分解代码来浪费时间。

这在几个层面上是一个有趣的问题,但有一些问题需要指出。首先,nhgrif发布的算法是正确的(并被接受),但请记住,对于给定的“product”函数,“int”和“long”返回值都很快溢出,因此代码实际上从未给出k=25的正确答案。事实上,对于int类型,所述算法只给出k=7的正确答案,即1838865600(在我的机器上)。之后,对于k>=8,数值是不正确的

这可以通过运行nhgrif的算法看到,其中prod()函数的输出显示为up k=10:

i = 1: -5
i = 2: -60
i = 3: -1140
i = 4: -29640
i = 5: -978120
i = 6: -39124800
i = 7: -1838865600
i = 8: -2147483648
i = 9: -2147483648
i = 10: -2147483648
.
.
.
从上面我们可以看到,int的最大值(大小)在i=8时很快达到,可以通过运行以下命令进行检查:

#include <iostream>
#include <limits>

int main(int argc, const char * argv[]) 
{    
    int maxInt = std::numeric_limits<int>::max();
    std::cout << "max: " << maxInt << std::endl;
    return 0;
}
我们还看到,对于long数据类型,我们也有同样的问题,但可以将其增加到k=12,直到long的限制达到k=13,即:-9223372036854775808

底线是上面公布的代码给出了Matt最初要求的k=25的错误答案

解决方案是对数字使用字符串表示法。这种字符串表示法通常用于超出普通数据类型限制的大数字(例如,魔方状态的#或一克碳中原子的#).但我认为这可能需要一些思考,因为计算需要表示为字符串上的操作,以避免直接处理int和long

有趣的是,M给出的函数
return -result;
i = 1: -5
i = 2: -60
i = 3: -1140
i = 4: -29640
i = 5: -978120
i = 6: -39124800
i = 7: -1838865600
i = 8: -2147483648
i = 9: -2147483648
i = 10: -2147483648
.
.
.
#include <iostream>
#include <limits>

int main(int argc, const char * argv[]) 
{    
    int maxInt = std::numeric_limits<int>::max();
    std::cout << "max: " << maxInt << std::endl;
    return 0;
}
max: 2147483647
#include <iostream>

long prod(int k);

int main(int argc, const char * argv[])
{
    int k = 10;
    for (int i = 1; i <= k; i++) {
        std::cout << "i = " << i << ": " << -prod(i) << std::endl;
    }

    return 0;
}

long prod(int k) {
    if (k == 1) {
    return 5;
    }
    else {
        return (7*k - 2)*prod(k - 1);
    }
}