【问题标题】:我想找到两个数字之间的范围之和?
【发布时间】:2022-01-23 14:45:21
【问题描述】:
#include <iostream>
#include <algorithm>
using namespace std; 

void sumrange(int x, int y) {
int sum;
    cout << "Enter the first number: ";
cin >> x;
  cout << "Enter the second number: ";
cin >> y ;



int bnum = max(x,y);
int snum = min(x,y);

int i = snum;
while (i < bnum) { sum =+ i; i++; }

cout << sum;
}

int main() {

int x, y;
sumrange(x,y);

return 0;

} 

我无法从我的输入中得到正确的答案,我尝试了 1 和 4,答案是 3,但它应该是 1+2+3+4,即 10。

【问题讨论】:

  • 变量sum未初始化。
  • 离题:关于 [using namespace std]...for 循环在这里更合适:for(int i = snum; i &lt;= bnum; ++i) { sum += i; }。注意:因为您想将bnum 本身也包含在您需要比较&lt;= 的总和中!也有点奇怪的是,您为函数提供了参数,而这些参数的值您从未使用过——然后只使用局部变量。顺便说一下,在将未初始化的xy 传递给函数的main 中是未定义的行为——即使它们从未在sumrange 中被读取。
  • 请注意,这可以在没有循环的情况下使用1+2+ ..+ n = n * (n+1)/2这一事实来实现,因此假设x &lt; yx + (x+1) + ... +y = x + x * (y - x) + 1 + 2 + ... + (y - x) = x (y-x+1) + (y - x) * (y-x + 1) / 2
  • 封闭公式的另一种变体:(bnum * (bnum + 1) - (snum - 1) * snum) / 2...
  • 您没有在输入后检查流 - 始终这样做是为了捕获无效的用户输入:if(cin &gt;&gt; x) { /* OK, can go on */ } else { /* some appropriate error handling */ }。虽然在给定的情况下,它会导致一个或两个值为 0,但您可能会再次出现致命错误......

标签: c++ loops function-definition


【解决方案1】:

几个观察:

  • 不要使用using namespace std;,这是一种不好的做法,可能会导致名称冲突
  • 变量int sum在使用前需要显式初始化
  • sum =+ i 应该是 sum += i
  • 如果要包含上限,则需要使用&lt;=
  • 看看arithmetic sequence
  • sumrange 函数不需要参数,因为它们是通过值传递的 int x, y; 从你的 main 根本不使用

下面的代码应该做你想做的事:

#include <iostream>
#include <algorithm>

void sumrange()
{
    int x;
    int y;
    int sum = 0;
    std::cout << "Enter the first number: ";
    std::cin >> x;
    std::cout << "Enter the second number: ";
    std::cin >> y ;

    int bnum = std::max(x,y);
    int snum = std::min(x,y);

    int i = snum;
    while (i <= bnum) { sum += i; i++; }

    std::cout << sum;
}

int main() {
    sumrange();
    return 0;
} 

【讨论】:

    【解决方案2】:

    您已将 += 符号反转为 =+ 它应该是 sum += isum = +i 将号码分配给自己

    编辑:您还应该初始化总和,在评论中说明

    【讨论】:

      【解决方案3】:

      您给定的代码 sn-p 存在 3 个问题

      问题一:=+在语句中应该是+=

      sum =+ i;   //=+ should be +=
      

      问题 2:变量sum未初始化,因此它具有垃圾值。使用该垃圾值会导致未定义的行为

      问题3:应该在语句中使用&lt;=而不是&lt;

      while (i < bnum)  //should be i<=bnum
      

      所以修改(更正)的程序如下所示:

      #include <iostream>
      #include <algorithm>
      
      void sumrange(int x, int y) {
          int sum=0;///INITIALIZE sum
          std::cout << "Enter the first number: ";
          std::cin >> x;
          
          std::cout << "Enter the second number: ";
          std::cin >> y ;
      
      
      
          int bnum = std::max(x,y);
          int snum = std::min(x,y);
      
          int i = snum;
          while (i <= bnum) //USED <=
          { 
              sum += i; //USED +=
              i++;
           }
      
          std::cout << sum;
      }
      
      int main() {
      
      int x, y;
      sumrange(x,y);
      
      return 0;
      
      } 
      

      替代解决方案

      请注意,您可以不使用循环找到总和,如下所示:

      #include <iostream>
      #include <algorithm>
      
      void sumrange(int x, int y) {
          int sum=0;//initialize sum
          std::cout << "Enter the first number: ";
          std::cin >> x;
          
          std::cout << "Enter the second number: ";
          std::cin >> y ;
      
          sum = (std::abs(x - y) + 1) * (x + y) / 2; //ADDED THIS 
      
          std::cout << sum;
      }
      
      int main() {
      
      int x, y;
      sumrange(x,y);
      
      return 0;
      
      } 
      

      【讨论】:

        【解决方案4】:

        C++20 解决方案:

        #include <algorithm>
        #include <iostream>
        #include <numeric>
        #include <ranges>
        
        int main()
        {
            int a{ 0 };
            int b{ 0 };
            std::cout << "Enter the first number: ";
            std::cin >> a;
            std::cout << "Enter the second number: ";
            std::cin >> b;
        
        
            auto lower_bound = std::min(a, b);
            auto upper_bound = std::max(a, b) + 1;  // iota view is exclusive so add 1
        
            auto view = std::ranges::iota_view{ lower_bound , upper_bound };
            auto sum = std::accumulate(view.begin(), view.end(), 0);
        
            std::cout << "sum = " << sum << "\n";
        
            return 0;
        
        }
        

        【讨论】:

          【解决方案5】:
          constexpr auto sumrange(const int x, const int y) noexcept {
          
              auto sum = 0;
          
              if (x < y) for (auto i = x; i <= y; ++i) sum += i; else 
              if (y < x) for (auto i = y; i <= x; ++i) sum += i;
          
              return sum;
          
          }
          
          int main() {
          
              constexpr auto x = 1;
              constexpr auto y = 3;
          
              constexpr auto r = sumrange(x, y); // 1 + 2 + 3
          
              std::cout << r << '\n'; // 6
          
          }
          

          【讨论】:

            【解决方案6】:

            此调用中未使用函数参数的值

            int x, y;
            sumrange(x,y);
            

            所以这样的称呼没有意义。

            您需要在 main 中要求用户输入一个数字范围并将该范围传递给函数。

            函数的任务是返回main中指定范围的计算总和。

            在函数sumrange 中,变量sum 未初始化。

            int sum;
            

            你需要把它初始化为0。

            在这个while循环中

            while (i < bnum) { sum =+ i; i++; }
                                   ^^
            

            有一个错字。您使用的是赋值运算符 = 和一元 + 运算符,而不是复合赋值运算符 +=

            此外,根据您的评论,您还需要将bnum 的值添加到sum

            所以循环应该至少看起来像

            while (i <= bnum) { sum += i; i++; }
            

            请注意,通常会发生溢出。所以最好将变量sum声明为long long int类型。

            函数和程序可以如下所示

            #include <iostream>
            #include <utility>
            #include <algorithm>
            
            long long int range_sum( int x, int y )
            {
                long long int sum = 0;
            
                auto [first, last] = std::minmax( { x, y } );
            
                do
                {
                    sum += first;
                } while (first++ != last);
            
                return sum;
            }
            
            int main()
            {
                int x = 0, y = 0;
            
                std::cout << "Enter the first number: ";
                std::cin >> x;
            
                std::cout << "Enter the second number: ";
                std::cin >> y;
            
                std::tie( x, y ) = std::minmax( { x, y } );
            
                std::cout << "The sum of numbers in the range ["
                          << x << ", " << y << "] is equal to "
                          << range_sum( x, y )
                          << '\n';
            }
            

            程序输出可能看起来像

            Enter the first number: 1
            Enter the second number: 10
            The sum of numbers in the range [1, 10] is equal to 55
            

            【讨论】:

              猜你喜欢
              • 2013-08-11
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-02-20
              • 1970-01-01
              • 2013-04-12
              相关资源
              最近更新 更多