程序无法正常运行

时间:2016-12-07 19:31:19

标签: c++ function

所以我的程序应该像这样工作:

  1. 输入整数n和m(例如n = 1; m = 10)
  2. 输入从n到m的所有值(例如1; 2; 3; 4; 5; 6; 7; 8; 9; 10)到动态数组中
  3. 然后使用bool函数,您必须在动态数组中搜索2个数字,这些数字被平方并相加在一起并形成某种第3个数字(例如1 * 1 + 1 * 1 = 2; 2 * 2 + 2 * 2 = 8等等)
  4. 该程序由于某种原因要么只打印第一个组合,要么根本不打印任何内容(例如,如果n = 1且m = 10,则只打印1 * 1 + 1 * 1 = 2 ,但它应该打印2 * 2 + 1 * 1 = 5; 2 * 2 + 2 * 2 = 8等等,如果n = 4且m = 200,它甚至不会打印任何东西)。问题出在哪里?我被困了好几个小时,在我看来这个程序应该可以工作,但事实并非如此。非常感谢。

        #include <iostream>
    
    using namespace std;
    
    bool isSquared (int i){
       // bool result = false;
    
        //int div;
        //int *squares = new int [i];
    
        for (int j=1;j<=i;j++){
            for (int k=1;k<=i;k++){
                if (k*k + j*j == i) return true;
                else return false;
            }
        }
    }
    
    
    int main()
    {
        int n,m,i,size;
    
        cin >>n;
        cin >>m;
    
        size = m - n;
        int *real = new int [m - n];
    
        for (int q=0, j=n; q<size, j<=m; q++, j++){
            real[q] = j;
        }
    
        for (int q=0; q<=size; q++){
            cout <<real[q] <<" | ";
        }
    
        cout <<endl;
    
        for (int i=n; i<=m; i++){
            if (isSquared(i) == true){
                for (int j=0; j<=size; j++){
                    for (int k=0; k<=size; k++){
                        if (real[j]*real[j] + real[k]*real[k] == i){
                            cout <<i <<"=" <<real[j] <<"*" <<real[j] <<"+" <<real[k] <<"*" <<real[k] <<endl;
                        }
                    }
    
                }
    
    
            }
        }
    
        return 0;
    }
    

1 个答案:

答案 0 :(得分:3)

您需要花费更多时间来分解任务的逻辑。您表达的方式令人困惑,我认为这有助于您编写代码的方式。

  
      
  1. 输入整数n和m(例如n = 1; m = 10)
  2.   
  3. 输入从n到m的所有值(例如1; 2; 3; 4; 5; 6; 7; 8; 9; 10)到动态数组中
  4.   
  5. 然后使用bool函数,您必须在动态数组中搜索2个数字,这些数字被平方并相加在一起并形成某种第3个数字(例如1 * 1 + 1 * 1 = 2; 2 * 2 + 2 * 2 = 8等等)
  6.   

我没有看到你如何写第1部分的(逻辑)问题,但为了清楚起见,我要将它们重命名为start和{{1} }。

end

第2部分是我们开始遇到问题的地方。对于初学者来说,通过手动管理动态内存,您已经使程序变得不必要地复杂化了。 //I'm also getting rid of superfluous variables we don't need. int start, end; cin >> start; cin >> end; 非常适合我们的任务(由于多个原因,您很快就会看到......)

std::vector

我们要将我们的值加载到std::vector<int> data; 。根据您的提示,datastart的输入是一个包含范围,因此我们会这样写:

end

在您的代码版本中,这只是令人困惑:

for(int i = start; i <= end; i++) {
    data.emplace_back(i);
}

您已将for (int q=0, j=n; q<size, j<=m; q++, j++){ real[q] = j; } 定义为size,这将是9,但提示需要1到10之间的所有数字,这意味着应该有10个数字;所以,蝙蝠,你会有错误。我建议的代码将更可靠地运作。

最后,让我们考虑第3步。它可以(并且应该)分解为几个步骤:

  • 对于m - ndata)中的每个号码,
    • 遍历它前面的每对数字(根据您的示例,可能包含重复项),以及每对(zx
    • 确定是否y,如果是,则将这些变量打印给用户。

所以,让我们写下那段代码。

x*x + y*y == z

对于//Note we're using data.size(), to ensure we stay in valid memory for(int i = 0; i < data.size(); i++) { int z = data[i]; //You can change the checks for j and k to "j <= i" and "k <= i" respectively //if you want solutions where z*z + z*z = z, which can happen if z == 0. for(int j = 0; j < i; j++) { //We don't need to repeat identical pairs, so we're starting k at j. for(int k = j; k < i; k++) { int x = data[j]; int y = data[k]; if(x*x + y*y == z) { std::cout << x << "*" << x << " + " << y << "*" << y << " = " << z << std::endl; } } } } 的输入,我得到以下输出:

1 10

对于1*1 + 1*1 = 2 1*1 + 2*2 = 5 2*2 + 2*2 = 8 1*1 + 3*3 = 10 的输入,我得到以下输出:

4 200