Преобразовать массив, увеличив его первую серию наибольшей длины на один элемент - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Привет ребят! Есть рабочая программа на паскале:
// Дан целочисленный массив размера N.
// Преобразовать массив,
// увеличив его первую серию наибольшей длины
// на один элемент
// (определение серии дано в задании Array116).
program Array128;
var
a: array [1..40] of integer;
B: array [1..20] of integer;
C: array [1..20] of integer;
temp,M,N,i,j:integer;
begin
writeln('Введите N (N<=20)');
readln(N);
writeln('Значения массива А');
for i:=1 to n do begin write('a[',i,']=');readln(A[i]); B[i]:=i; end;
// решение
temp:=0;
m:=0;
// формируем из исходного массива A[] два с длиной серий B[] и значением серий C[]
for i:=2 to n do
begin
inc(temp);
if a[i]<>a[i-1] then
begin
inc(M);
B[M]:=temp;
C[M]:=a[i-1];
temp:=0;
end;
end;
inc(temp);
inc(M);
b[M]:=temp;
C[M]:=a[i];
// складываем массив A[] согласно задания.
temp:=1;
for i:=1 to m do
begin
if b[i]>b[temp] then
begin
temp:=i;
end;
end;
inc(b[temp]);
 
temp:=0;
for i:=1 to m do
begin
for j:=1 to b[i] do
begin
inc(temp);
a[temp]:=c[i];
end;
end;
Writeln;
Writeln('Ответ');
Write(' A[]: '); for i:=1 to temp do Write(A[i],' ');
end.
Помогите, пожалуйста, перевести данный код в СИ. Заранее спасибо! У самого получилось вот такое( не работает ):
#include <cstdio>
#include <stdlib.h>
#include <locale>
int main()
{
    setlocale(LC_ALL,"Russian");
    int a[50],
        B[30],
        C[30],
        temp, M,N,i,j;
    printf("Введите N \n");
    scanf("%d", &N);
    printf("Значения массива А");
    for(i=1;i<=N;i++)
     {
         printf("a[%d]=", i);
         scanf("%d", &a[i]);
         B[i]=i;
    }
    //решение
    temp=0;
    M=0;
    // формируем из исходного массива A[] два с длиной серий B[] и значением серий C[]
    for(i=2;i<=N;i++)
        {
            temp++;
            if(a[i]!=a[i-1])
             {
                M++;
                B[M]=temp;
                C[M]=a[i-1];
                temp=0;
             }
        }
    temp++;
    M++;
    B[M]=temp;
    C[M]=a[i];
    // складываем массив A[] согласно заданию
    temp=1;
    for(i=1;i<=N;i++)
    {
        if(B[i]>B[temp])
        {
            temp=i;
        }
    }
    B[temp]++;
 
    temp=0;
    for(i=1;i<=M;i++)
    {
        for(j=0;j<B[i];j++)
        {
            temp++;
            a[temp]=C[i];
        }
    }
    printf("\n");
    printf("Ответ ");
    printf(" A[]: ");
    for (i=1;i<=temp;i++) printf("%d ", a[i]);
    system("pause");
    return 0;
}

Решение задачи: «Преобразовать массив, увеличив его первую серию наибольшей длины на один элемент»

textual
Листинг программы
#include <stdio.h>
 
int main(void)
{
    int N, i;
 
    puts("Введите N (N<=20)");
    scanf("%i", &N);
 
    int A[N+1];
    puts("Значения массива А");
    for(i=0; i<N; i++) {
        printf("A[%02i] = ", i+1);
        scanf("%i", &A[i]);
    }
 
    int *ptr;
    int *ptrR = NULL;
    int temp = 0;
    int temp2;
    int max = 0;
 
    /* Поиск последнего элемента
     * самой длинной серии.
     ****************************/
    for( ptr = A, i=0; i<N-1; ptr++, i++) {
        if (*ptr == *(ptr+1)) 
            temp++;
        else
            temp = 0;
        if (temp > max) {
            max = temp;
            ptrR = ptr+1;
        }
    }
    
    /* Если таковой есть,
     * начиная с него и все
     * последующие, перенести на
     * один адрес дальше.
     **********************/
    if (ptrR) {
        for (i=0, ptr=A; i<N; i++, ptr++) 
            if (ptrR==ptr) break;
        i = N-i;
        temp = *ptr;
        while(i--) {
            ++ptr;
            temp2 = *ptr;
            *ptr = temp;
            temp = temp2;
        }
        N++;
    }
 
    printf("\nОтвет\n");
    for (i=0; i<N; i++)
        printf("A[%02i] = %i\n", i+1, A[i]);
 
    return 0;
}

Объяснение кода листинга программы

  1. Ввод значения N (N<=20) с клавиатуры
  2. Инициализация массива A[N+1]
  3. Ввод значений массива A
  4. Инициализация переменных ptr, i, temp, temp2, max, ptrR
  5. Поиск последнего элемента самой длинной серии (цикл for) а) Если элементы равны, увеличиваем значение temp б) Если элементы не равны, сбрасываем значение temp в 0 в) Если значение temp больше max, обновляем max и ptrR
  6. Если ptrR не равно NULL (т.е. найдена серия), а) Перемещение элементов серии на один адрес дальше (цикл for) б) Обновление значения N
  7. Вывод значений массива A
  8. Возврат 0 (конец работы программы)

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 3.833 из 5
Похожие ответы