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