Произведение чисел, не печатая правильный номер - PullRequest
0 голосов
/ 01 марта 2012

У меня есть двумерный массив (матрица), в котором я пытаюсь вычислить наибольшее произведение соседних чисел.Это очень похоже на Project Euler Задача 11 , за исключением того, что пользователь вводит, сколько смежных чисел они хотят в расчете.У меня все хорошо, я думаю.Проблема в том, что если я использую целые числа для вычисления произведения, скажем, 5 целых чисел из 99 (например, 99 * 99 * 99 * 99 * 99), оно не будет отображаться правильно.Максимальное количество соседних чисел, которое можно проверить, равно 99. Я попытался изменить на длинные двойные числа (как вы можете видеть в коде), но он печатает смешные числа, например, с 3 соседними числами я ввел 99 во всех позициях матрицы и должен получитьназад 970299 (что я делаю, когда maxProduct имеет тип int), но вместо этого я получаю:

-497917511184158537131936752181264370659584929560826523880745083032965215342755650440802286656251727430041200624372430370294634536699364412350122489510814753628581807006780156992324264734484592980976635224618682514265787653963930812412392499329499188301075222828863209569131692032

Я чувствую, что это что-то очевидное, но я просто не вижу этого.

#include <stdio.h>
#include <stdlib.h>

long double calcProduct(int n, int m, int ** matrix)
{
    int i, x, y; //Loop counters
    long double maxProduct; //Used to hold the maximum product of numbers found so far
    long double temp; //Used to hold the current product of numbers

    //Searching left to right
    for(y = 0; y < n; y++)
    {
        for(x = 0; x <= n - m; x++)
        {
            for(i = 0; i < m; i++)
            {
                temp *= matrix[x + i][y];
            }

            if(temp > maxProduct)
            {
                maxProduct = temp;
            }

        temp = 1;
        }
    }

    //Searching top down
    for(x = 0; x < n; x++)
    {
        for(y = 0; y <= n - m; y++)
        {
            for(i = 0; i < m; i++)
            {
                temp *= matrix[x][y + i];
            }

            if(temp > maxProduct)
            {
                maxProduct = temp;
            }

        temp = 1;
        }
    }

    temp = 1;

    //Searching diagonal down right
    for(x = 0; x < n - m; x++)
    {
        for(y = 0; y <= n - m; y++)
        {
            for(i = 0; i < m; i++)
            {
                temp *= matrix[x + i][y + i];
            }

            if(temp > maxProduct)
            {
                maxProduct = temp;  
            }

        temp = 1;
        }
    }

    temp = 1;

    //Searching diagonal up right
    for(x = 0; x < n - m; x++)
    {
        for(y = n - 1; y >= m - 1; y--)
        {
            for(i = 0; i < m; i++)
            {
                temp *= matrix[x + i][y - i];
            }

            if(temp > maxProduct)
            {
                maxProduct = temp;  
            }

        temp = 1;
        }
    }

    return maxProduct;
}

main()
{
    int ** matrix; //2D array to hold the matrix items
    int n, m; //Used to hold the size of the matrix (n) and the number of adjacent numbers to include in the calculation (m)
    int i, j; //Loop counters

    //Taking input of n (for size of grid) and m (number of adjacent numbers to include in calculation)

    scanf("%d %d", &n, &m);


    //Assign the array 'matrix' with the size of int multiplied by the number of items to hold (n)
    matrix = (int **)malloc(sizeof(int*)*n);
    //If the matrix is null then exit the program
    if (matrix == NULL) 
    {
        exit (0);
    }

    for(i = 0; i < n; i++)
    {
        matrix[i] = (int *)malloc(sizeof(int)*n);
        if(matrix[i] == NULL) exit (0);
    }

    //Getting the numbers which are held in the matrix
    for(i = 0; i < n; i++)
    {
        for(j = 0; j < n; j++)
        {
            scanf("%d", &matrix[i][j]);
        }
    }

    //Prints the highest product by calling the method calcProduct, giving it n, m and the array matrix
    printf("%.0Lf", calcProduct(n, m, matrix));     
}

Ответы [ 2 ]

7 голосов
/ 01 марта 2012

temp не инициализируется в calcProduct, равно как и maxProduct. Они будут содержать случайные значения мусора в первый раз в цикле, который портит ваш результат maxProduct.

1 голос
/ 01 марта 2012
Матрица

имеет тип int-Array, но ваш scanf () «удваивается» в нее

...