Преобразовать массив, увеличив его первую серию наибольшей длины на один элемент - 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;
}
Объяснение кода листинга программы
- Ввод значения N (N<=20) с клавиатуры
- Инициализация массива A[N+1]
- Ввод значений массива A
- Инициализация переменных ptr, i, temp, temp2, max, ptrR
- Поиск последнего элемента самой длинной серии (цикл for) а) Если элементы равны, увеличиваем значение temp б) Если элементы не равны, сбрасываем значение temp в 0 в) Если значение temp больше max, обновляем max и ptrR
- Если ptrR не равно NULL (т.е. найдена серия), а) Перемещение элементов серии на один адрес дальше (цикл for) б) Обновление значения N
- Вывод значений массива A
- Возврат 0 (конец работы программы)