编写一个函数,该函数计算并返回被3整除的两个目标数字之间的整数总数

时间:2019-10-20 19:49:04

标签: c++ function

我被分配来编写这段代码,起初看起来很简单。我写了出来,试图尽我所能来理解它,真的以为我记下来了。但是,当我尝试使用VisualStudio检查代码时,会弹出代码错误,并且代码无法完成处理。

这是作业:

编写一个名为specialNumbers的函数,该函数计算并返回被3整除的两个目标数字之间的整数总数。该函数采用两个参数: 1.整数 2.结束,大于开始的整数 该函数返回3的整数倍,在开始和结束之间(包括3和2)。 例如,如果start = 3,end = 10,则该函数将返回3。

这是我到目前为止的代码:

#include <iostream>
using namespace std;

int specialNumbers(int start, int end) {
    int count = 0;
    for (int i = start; i < end; i++) {
        if (i % 3 == 0)
            count++;
    }
    return count;
} 

int main() {
    int a, b;
    cout << "Enter two numbers to find total number of integars divisble by 3 between them" << endl;
    cin >> a, b;
    int n = specialNumbers(a, b);
    cout << "Number of integars divisible by 3 between" << a << "and" << b << "are" << n << endl;
    return 0;
}

显示的错误是

  

调试错误!变量b已使用且未初始化

3 个答案:

答案 0 :(得分:3)

您使用错误的语法从cin中提取了两个整数,应该是:

cin >> a >> b;

由于comma operator的语义,您的代码给出了“未初始化的错误”,该语义带有两个参数并返回后者。

简单地说,您的代码等效于:

(cin >> a), b;  // ERROR: `b` isn't being initialized.

答案 1 :(得分:0)

更改更改此内容:

<div class="box">
  <span>aa</span>
  <span>b</span>
  <span>ccc</span>
  <span>d</span>
  <span>eeee</span>
</div>

<div class="box">
  <span>aa</span>
  <span>b</span>
  <span>eeee</span>
</div>

收件人:

cin >> a, b;

因为在这种情况下您完全不希望使用逗号运算符,而是使用cin >> a >> b; 运算符。

答案 2 :(得分:0)

其他答案涉及对cin的正确使用,但是也存在算法错误。如果最后一个数字是3的倍数,则代码将返回错误的结果。

例如,如果输入数字4和6,则当6是3的倍数时应返回1时将返回0。

这可以通过更改来纠正:

for (int i = start; i < end; i++) {

for (int i = start; i <= end; i++) {

但是,当整数分开时,该算法效率极低。检查每个整数(例如15和2,000,000,000)将非常耗时。这就像将两个数字相乘,只是一遍又一遍地相加。

此代码首先会注意到,如果从起始值和结束值中减去3的倍数,则被3整除的值的数量将保持不变。

第二,执行此操作后,开始和结束之间的值(包括端值)将恰好是end/3的值,如果start==0

因此,此代码将产生正确的答案而不会循环:

#include <iostream>
using namespace std;

int specialNumbers(int start, int end) {
    int adj = 3 * (start / 3);  // find and remove the multiples of 3 from start and end
    start = start - adj;        // start will now be either 0, 1 or 2
    end = end - adj;
    int count = end / 3;        // count is the number of exact multiples of 3 in the sequence
    if (start == 0)             // unless the adjusted start is zero in which case it must be incremented
        count++;
    return count;
    }

int main() {
    int a, b;
    while (1) {
        cout << "Enter two numbers to find total number of integars divisble by 3 between them" << endl;
        cin >> a >> b;
        int n = specialNumbers(a, b);
        cout << "Number of integars divisible by 3 between" << a << "and" << b << "are" << n << endl;
    }
    return 0;
}