@samsungovetch

C — Как в массиве найти наибольшую подпоследовательность полных квадратов?

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

void ent(int *arrayName, int arraySize)
{
    int i;


	for (int i = 0; i < arraySize; i++)
	{
		printf("a[%i] = ", i);
		scanf("%i", &arrayName[i]);
	}
}

void proc(int *arrayName, int arraySize) {
    int i,k = 0;
    int flag = 0;
    for (i = 0; i < arraySize; ++i)
    {
        if ((sqrt(arrayName[i])) == (round((sqrt(arrayName[i])))))
            {
                printf("%d - full square \n", arrayName[i]);
                k++;
            }
        else
            {
                if (k!=0)
                    k = 1;
            }
    }
    printf("Max otrezok = %d \n", k);
}

void printArray(int *arrayName, int arraySize) {
    int i;
    for (i = 0; i < arraySize; ++i) {
        printf("%d ", arrayName[i]);
    }
}

void main()
{   int i;
	int n;//
	int squar = 0;

	printf("Size Massive: ");
	scanf("%d", &n);

    int Arr[n];
	ent(Arr, n);

	printf("Array: ");
    printArray(Arr, n);
    
    printf("\n");

    proc(Arr,n);
    


    system("pause");
}


Имею данный код. В данной процедуре

void proc(int *arrayName, int arraySize) {
    int i,k = 0;
    int flag = 0;
    for (i = 0; i < arraySize; ++i)
    {
        if ((sqrt(arrayName[i])) == (round((sqrt(arrayName[i])))))
            {
                printf("%d - full square \n", arrayName[i]);
                k++;
            }
        else
            {
                if (k!=0)
                    k = 1;
            }
    }
    printf("Max otrezok = %d \n", k);
}


при вводе, например, 1 2 1 2 1 в ответ выдаётся, что макс. подпослед. = 2.

Помогите починить условия.
  • Вопрос задан
  • 94 просмотра
Пригласить эксперта
Ответы на вопрос 3
doublench21
@doublench21
t.me/jeudesprits (Если очень нужно)
А Вы вообще понимаете, что такое максимальная подпоследовательность ? Судя по вашему алгоритму - нет.
Да и код Вы под чем пишите? Под пивом? Всё пляшет как ни знаю как.

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

void ent(int * arrayName, int arraySize) {
     // int i; Так давно уже писать не нужно

        for (int i = 0; i < arraySize; i++) {
            printf("a[%i] = ", i);
            scanf("%i", & arrayName[i]);
        }
}

void proc(int * arrayName, int arraySize) {
    int repeat = 0, maxRepeat = 0;

    for (int i = 0; i < arraySize; ++i) {
        if (checkSquareNumber(arrayName[i])) {
            printf("%d - full square \n", arrayName[i]);
            repeat++;
        } else {
            repeat = 0;
        }
        maxRepeat = repeat > maxRepeat ? repeat : maxRepeat;
    }

    printf("Max otrezok = %d \n", repeat); // Забыли как будет слово отрезок на английском? 
}

int checkSquareNumber(int number) {
    if (number == 0 || number == 1)
        return 1;

    if (number % 4 == 0 || number % 9 == 0)
        return 1;

    if (number % 8 == 1 || number % 3 == 1)
        return 1;

    return 0;
}

void printArray(int * arrayName, int arraySize) {
    // int i; Так давно уже писать не нужно
    for (int i = 0; i < arraySize; ++i) {
        printf("%d ", arrayName[i]);
    }
}

void main() {
    int i;
    int n; //
    int squar = 0;

    printf("Size Massive: "); // Забыли как будет слово массив на английском? 
    scanf("%d", & n);

    int Arr[n];
    ent(Arr, n);

    printf("Array: ");
    printArray(Arr, n);

    printf("\n");

    proc(Arr, n);

    system("pause");
}
Ответ написан
@res2001
Developer, ex-admin
1. 2 - потому что вы делаете k = 1, когда последовательность кончается. Делайте k = 0 - будет 1.
И уберите условие - оно совершенно лишнее.
else
            {
                    k = 0;
            }


2.На мой взгляд вычислять является ли число полным квадратом таким образом нельзя - как минимум, потому что сравнивать вещественные числа напрямую - плохая идея. Почитайте для затравки, например тут.
Я бы сделал как-то так:
double v = sqrt(arrayName[i]);
double v1 = floor(v);
if((v - v1) < 0.000001)
{
// число- полный квадрат
}

Константу 0.000001 - я выбрал наугад, как достаточно маленькую для вашего случая.
Вообще вопрос сравнения вещественных чисел - отдельная тема, представленный выше подход, лишь один из вариантов, не самый лучший, но в вашем случае работать будет.
Ответ написан
@samsungovetch Автор вопроса
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

void ent(int *arrayName, int arraySize)
{
    int i;


	for (int i = 0; i < arraySize; i++)
	{
		printf("a[%i] = ", i);
		scanf("%i", &arrayName[i]);
	}
}

void proc(int *arrayName, int arraySize) {
    int i,k = 0, max = 0;
    int flag = 0;
    for (i = 0; i < arraySize; ++i)
    {
        if ((sqrt(arrayName[i])) == (round((sqrt(arrayName[i])))))
            {
                printf("%d - full square \n", arrayName[i]);
                k++;
            }
        else k = 0;
        if (k>max)
            max = k;
    }
    printf("Max otrezok = %d \n", max);
}

void printArray(int *arrayName, int arraySize) {
    int i;
    for (i = 0; i < arraySize; ++i) {
        printf("%d ", arrayName[i]);
    }
}

void main()
{   int i;
	int n;//
	int squar = 0;

	printf("Size Massive: ");
	scanf("%d", &n);

    int Arr[n];
	ent(Arr, n);

	printf("Array: ");
    printArray(Arr, n);

    printf("\n");

    proc(Arr,n);



    system("pause");
}


Правильный код
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы