Язык C isMagicsquare: какая логическая ошибка в коде моей функции?

В моем случае проблема заключалась в отсутствии строки XamlCompilation(XamlCompilationOptions.Compile)] в файле .xaml.cs.

Пример:

[XamlCompilation(XamlCompilationOptions.Compile)]
public partial class MainPage : ContentPage
{
    public MainPage()
    {
        InitializeComponent();
        BindingContext = new MainPageViewModel();
    }
    ...
}
1
задан Vinxent 2 March 2019 в 22:51
поделиться

2 ответа

кажется, что sum3 var повторно инициализируется в 0 внутри цикла вычислений, плюс проверка равенства по диагональной сумме должна быть вне цикла.

Я бы переработал это следующим образом:

//For Diagonals
sum = 0;
sum3 = 0;
for (row = 0; row < n; row++) {
    sum  += square[row][row];
    sum3 += square[row][n - 1 - row];
}
if (sum == sum3)
    boolean = 1;
else {
    return FALSE;
}

Кстати, я немного упростил вычисление диагонали, так как оно линейное, нет необходимости в 2 вложенных циклах.

Я обнаружил некоторые другие ошибки в финальных проверках:

-0 не должно быть действительным значением

-обращение, а не просто разрыв (существует только внутренний цикл, внешний цикл продолжается)

for (row = 0; row < n; row++) {
    for (col = 0; col < n; col++) {
        if(square[row][col] > n*n || square[row][col] <= 0) {
            return FALSE;
        }
    }
}

//Check for Repeating Numbers
int storedNumbers[n * n];
for (row = 0; row < n; row++) {
    for(col = 0; col < n; col++) {
        storedNumbers[row + n * col] = square[row][col];
    }
}

Затем отсканируйте сохраненные номера на наличие дубликатов. Поиск повторяющихся значений в массиве

ура

0
ответ дан gmathio 2 March 2019 в 22:51
поделиться

Вы можете использовать более компактную схему, чтобы проверить, что все числа 1 .. (n*n) используются без дубликатов с использованием кода, такого как:

int counts[n * n];  // Can't use an initializer with a VLA
memset(counts, '\0', sizeof(counts));

for (int i = 0; i < n; i++)
{
    for (int j = 0; j < n; j++)
    {
        if (square[i][j] <= 0 || square[i][j] > n * n)
            return FALSE;
        counts[square[i][j] - 1]++;  // Map 1..n*n to 0..n*n-1
        // if (++counts[square[i][j] - 1] > 1)
        //     return FALSE;
    }
}

for (int i = 0; i < n * n; i++)
{
    if (counts[i] != 1)
        return FALSE;
}

Поскольку существует n*n элементов для проверки, этот код использует пространство и время, которые являются линейными по отношению к количеству элементов в магическом квадрате, который находится в пределах постоянного фактора оптимального.

0
ответ дан Jonathan Leffler 2 March 2019 в 22:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: