2013-11-26 2 views
-1

Задача состоит в поиске чисел в массиве, которые являются квадратами и печатают сумму каждых двух квадратов. Например, массив начинается с 1 и заканчивается на 9. Прежде всего, нужно найти квадраты в массиве. В этом случае - 1, 4, 9. И сумма каждого из них будет равна 1 + 4 = , 1 + 9 = , 4 + 9 = . В моей программе, когда я вхожу в начальное значение 1 и заканчивая значение 9, он просто печатает массив от 1 до 9. Не знаю, где проблема.Поиск квадратной суммы в массиве

#include <iostream> 
#include <math.h> 
using namespace std; 

int arr[10][4]; 
bool sqrsum(int); //prototype 

int main(){ 
int n,m,j,a,b,x,y,finalpoint; 
bool noresult; 
cout << "Enter array starting value: " << endl; 
cin >> n; 
cout << "Enter array ending value: " << endl; 
cin >> m; 

if ((n<0)|| (m<0)) 
{ 
    cout << "Values cannot be negative." << endl; 

} 

if (n>m) 
{ 
    j=n; 
    n=m; 
    m=j; 
} 
for (int i=n; i<=m; i++) 
{ 
    if (sqrsum(i) == true) 
    { 
     for (int g=0; g<10; g++) 
      if (arr[g][0] == -9) 
     { 
      finalpoint = g; 
      break; 
     } 
    } 
    if (finalpoint == 1) 
    { 
     cout << i << endl; 
    } 
    else 
    { 
     for (int g=0; g < (finalpoint/2); g++) 
     { 
      cout << i << endl; 
     } 
    } 
    noresult = false; 
} 
if (noresult == true) 
{ 
    cout << "There is no valid square sum." << endl; 
} 
} 


bool sqrsum(int i) 
{ 
int arr1[101]; 
int x; // Last address 
int z = 0; 
bool rettrue = false; 
//Function finding squares and their sum. 
for (int j=0;j<10;j++) 
{ 
    for (int k=0;k<4;k++) 
    { 
     arr[j][k] = -9; 
    } 
} 
//Finding possible squares 
for (int j=0; pow(j,2)<=i; j++) 
{ 
    arr1[j] = pow(j,2); 
    x = j; 
} 
//Cycles of sum 
for (int j=0; j<=x; j++) 
{ 
    for (int k=0; k<=x; k++) 
    { 
     if (arr1[j] + arr1[k] == i) 
     { 
      arr[z][0] = arr1[j]; 
      arr[z][1] = arr1[k]; 
      arr[z][2] = j; 
      arr[z][3] = k; 
      z++; 
      rettrue=true; 
     } 
    } 
} 
if (rettrue == true) 
    return true; 
else 
    return false; 
} 
+1

Начните с того места, где вы наблюдаете нежелательное поведение, и работайте назад, ища ошибки в расчетах или логике. Вставьте инструкции в выходные значения в стратегических точках вашей программы, чтобы вы могли самостоятельно изучить состояние или использовать отладчик. Этот процесс называется * отладки программы *, и это то, что каждый программист должен научиться самостоятельно. – paddy

+1

Дополнительная информация: http://meta.stackexchange.com/a/182380/200806 – paddy

+0

@paddy в этом случае работа назад может быть немного продвинутой, я бы рекомендовал тщательный шаг с отладчиком каждой строки. Примечание. По-видимому, этот код может выводить только цифры 1-9, по одной строке за раз, иногда один раз, возможно, иногда более одного раза ... 'i' - это все, что когда-либо выводится. –

ответ

1

Я думаю, что вы усложняете вещи; Вы знаете, что вы заинтересованы только в квадратных чисел в интервале [n..m], поэтому просто вычислить их:

for(i=n;i<=m/2;i++) 
{ 
    int s = i*i; 
    if(s<=m) 
    squares[i] =s; 
} 

теперь, когда у вас есть все квадрат в интервале просто вычислить все суммы.

+0

Я не понимаю, может быть, я слишком устал. Я думаю, что я расскажу о ситуации, о которой вы упомянули в инструкции If (..) – Pandrei

+0

. О, извините, вы ссылались на комментарий, который я уже удалил, наконец понял это. Да, это покрыто. Получение if и loop условно для выравнивания - это кошмар для элегантности здесь ... Примечание: 'i' должен начинаться с 1, а не на n, хотя. –

0

Что-то вроде этого:

// Loop over every value. 
for (int i=start; i<end; i++) { 
    if (!isSquare(i)) continue; 
    // Sum this value with all values after it. 
    for (int j=i+1; j<=end; j++) { 
    if (!isSquare(j)) continue; 
    // Print the sum of these two squares. 
    cout << i << "+" << j << "=" << i+j << endl; 
    } 
} 

Это проверяет каждое число в диапазоне, чтобы увидеть, если это квадрат. Вы могли бы пойти в обратном направлении (по аналогии с другим ответом):

// Loop over every square. 
for (int i=start; i<end/2; i++) { 
    if (i*i < end) { 
    for (int j=i+1; j<=end/2; j++) { 
     if (j*j <= end) { 
     // Print the sum of these two squares. 
     cout << i*i << "+" << j*j << "=" << i*i+j*j << endl; 
     } 
    } 
    } 
} 

Для повышения эффективности, вы можете хранить I * I и J * J расчеты в переменном.

0

Я не понимаю эти ответы, которые публикуют люди. Вот решение, которое не так уж плохо, конечно, не ультра оптимизировано, но оно понятно и находит ответ на запрос.

#include <iostream> 
#include <cmath> 
#include <vector> 

using namespace std; 

int main() 
{ 
    // find values that are squares in range [b,e] 
    int b, e; 

    // Get those values from user 
    cout << "Enter array starting value: "; 
    cin >> b; 
    cout << "Enter array ending value: "; 
    cin >> e; 

    if(b<0 || e<0) 
     cerr << "Values cannot be negative." << endl; 

    if(e < b) 
     cerr << "The starting value must be smaller or equal to the ending value." << endl; 

    // Find all squares in range [b, e] and save them in a vector. 
    vector<int> squares; 
    for(int i = sqrt(b); i < e/2; ++i) 
    { 
     int possibleSquare = i*i; 
     if(possibleSquare >= b && possibleSquare <= e) 
      squares.push_back(possibleSquare); 
    } 

    // Output the sum of every pair in that vector of squares 
    if(squares.empty()) 
    { 
     cout << "There are no squares in [" << b << "," << e << "]" << endl; 
     return 0; 
    } 

    cout << "\nEvery pairwise sum of every square in that range: " << endl; 
    for(int i = 0; i < squares.size(); ++i) 
     for(int j = i+1; j < squares.size(); ++j) 
      cout << squares[i] + squares[j] << endl; 
} 
Смежные вопросы