我正在尝试编写一个for循环来累加2个整数之间的和 2-9 = 2 + 3 + 4 + 5 ... + 9 我使用if语句来确定输入中的较大整数。 不知何故,即使条件返回false值,for也会执行一次。 因此我一直得到错误的价值 这是我写的代码。 提前谢谢。
#include <iostream>
using namespace std;
int main(){
int in1, in2;
void accumulate_sum(int i1, int i2);
cout<<"Enter two integer:"<<endl;
cout<<"Integer 1:"<<endl;
cin>>in1;
cout<<"Integer 2:"<<endl;
cin>>in2;
accumulate_sum(in1, in2);
return 0;
}
void accumulate_sum(int i1, int i2){
int i, sum, ca;
if (i1 > i2)
{
ca=1;
for (i=i2;i<(i1+1); i++) {
sum+=i;
}
}
else {
i=i1;
for (i;i<(i2+1); i++) {
sum+=i;
}
}
switch (ca) {
case 1:
cout<<"the sume from "<<i2<<" to "<<i1<<" is "<<sum<<endl;
break;
default: cout<<"the sume from "<<i1<<" to "<<i2<<" is "<<sum<<endl;
break;
}
}
答案 0 :(得分:2)
一个简单的解决方案:
程序中存在的问题是因为在开始添加值之前,您没有初始化sum
。您还可以检查交换机中的ca
,即使路径中有未初始化的路径。将它们都设置为您声明它们的0
,一切都应该有效。
进一步改进/需要思考的事项:
要改进,存储最小值和最大值可以使您的功能更漂亮更快:
void accumulate_sum(int i1, int i2) {
int sum = 0;
int min = i1;
int max = i2;
if (i1 > i2) {
min = i2;
max = i1;
}
for (int i = min; i <= max; i++)
sum += i;
cout << "the sum from " << min << " to " << max " is " << sum << endl;
}
使用science of partial sums,您可以使用单个公式重写for
。
由于1和n
之间的所有自然数之和可以简化为......
我们可以证明min
到max
的所有自然数之和等于(((从1到max
之和) - (从1到{的总和{1}}))+ min
)...
然后我们可以用公式替换我们的min
循环...
for
此外,在void accumulate_sum(int i1, int i2) {
int min = i1;
int max = i2;
if (i1 > i2) {
min = i2;
max = i1;
}
int sum = (max*(max+1))/2 - (min*(min+1))/2 + min;
cout << "the sum from " << min << " to " << max " is " << sum << endl;
}
之外宣布您的职能是一种很好的做法,除非您有充分的理由这样做:
main()
答案 1 :(得分:2)
实际上是一个数学公式,用于将所有数字从n加到m,如下所示:
应用此公式可使您的代码更快更干净,如下所示:
template <class T>
T accumulate_sum(T n, T m) {
if (m<n) std::swap(n, m);
return (m*(m+1))/2 - (n*(n+1))/2 + n;
}
当然模板不是必需的,但如果你用无符号整数类型调用函数,那么将它转换为函数内的int
(已签名)并不是一个好主意。
安全类型(如果可能的话,不要进行无符号签名(反之亦然)转换),避免不必要的原始循环,并且如果可以,请始终使用STL! 我不是C ++专家(也不想像我一样假装),但记住这些很好!
干杯
答案 2 :(得分:0)
你只忘了将总和设为0。
更多地使用std :: min,std :: max并尽可能多地调整变量范围。
#include <iostream>
void accumulate_sum(int i1, int i2);
int main(){
int in1, in2;
std::cout << "Enter two integer:" << std::endl;
std::cout << "Integer 1:" << std::endl;
std::cin >> in1;
std::cout << "Integer 2:" << std::endl;
std::cin >> in2;
accumulate_sum(in1, in2);
return 0;
}
void accumulate_sum(int i1, int i2){
int sum = 0;
int min = std::min(i1, i2);
int max = std::max(i1, i2);
for (int i=min; i<=max; ++i)
sum+=i;
std::cout << "the sum from " << min << " to " << max << " is " << sum << std::endl;
}
我还没有看到你在main函数中声明accumulate_sum。不要这样做。
在代码中留下空白行和空格不是问题,它可以提高可读性。
答案 3 :(得分:0)
试试这个
accumulate_sum(int integer1, int integer2){
int min = integer1 < integer2 ? integer1 : integer2;
int max = integer1 > integer2 ? integer1 : integer2;
int sum = 0;
for (int i = min; i < max; ++i){
sum += i;
}
cout << "the sum of integers from " << min << " to " << max << " is " << sum;
}
然后删除if和else语句,只需编写一次代码。