Задача состоит в том, чтобы искать числа в массиве, которые являются квадратами, и выводить сумму каждых двух квадратов.
Например, массив начинается с 1 и заканчивается 9. Прежде всего, должен найти квадраты в массиве. В этом случае — 1, 4, 9. И сумма каждого будет 1 + 4 =5, 1 + 9 = 10, 4 + 9 = 13. В моей программе, когда я ввожу начальное значение 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;
}
Я думаю, что вы усложняете вещи; Вы знаете, что вас интересуют только квадратные числа в интервале [n..m], поэтому просто рассчитайте их:
for(i=n;i<=m/2;i++)
{
int s = i*i;
if(s<=m)
squares[i] =s;
}
теперь, когда у вас есть все квадраты в интервале, просто вычислите все суммы.
Что-то вроде этого:
// 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 в переменной.
Я не понимаю эти ответы, которые публикуют люди. Вот решение, которое не так уж плохо, конечно, не ультраоптимизировано, но понятно и находит ответ на запрос.
#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;
}