Помогите с массивами

  • Автор темы CppManiac
  • Дата начала
C

CppManiac

#1
Помогите, подкинте идей как сие решать:
1)-Все ли пары элементов линейного массива имеют только одну общую цифру в своей записи?
2)-В каждом столбце матрицы найти наибольшую группу подряд идущих элементов, образующих арифметическую прогрессию?
Идеи есть?
по поводу 1) то я начинал ковырятся но безрезультатно и не до конца развил идею, идея была такова: создать новый массив в который занести все элементы массива таким образом если было число 154, то станет 1 5 4, но ерунда это

Код:
#include <stdio.h>
void main(){
int kol=0;
int c;
const int n=20;
int mas2[n];
int mas[n]={12, 21, 70, 40, 5, 1, 33, 14, 41};
for(int i = 0; mas[i]>=1; i++)
{
for(int k=0; k<kol; k++)
{
mas2[k]=mas[i]%10; 
mas[i]=mas[i]/10;
}
kol++;	
}
printf(\"\\n %d \",kol);
kol--;
//for(int k = 0; k<10; k++)
//{
//	/*if(mas[k]=mas[k+1])*/
//}
for(int k = 0; k<kol; k++)
{
printf(\"%2d\",mas2[k]);
}
}
 

DarkKnight

Well-known member
01.08.2010
653
0
#3
Напиши задание нормально... А то оно как то не полностью выглядит...
Что дано, что сделать.
А по первому, если ты конечно правельно понял, то решение вот такое..
C++:
#include <iostream>
#include <vector> //для векторов

using namespace std;

int main(void)
{
const int SizeM = 6;
int Mass[SizeM] = {200,21,19,21,15,57};
vector <int> Cifr[SizeM];

//Заполняем вектора цифрами
for (int i=0;i<6;i++)
{
int Mods = Mass[i];
while (Mods>9)
{
Cifr[i].push_back(Mods%10);

Mods /= 10;
}
Cifr[i].push_back(Mods);
}


//проверяем на вхождение соседних цифр
//Начнем не с 0 а с 1. что бы можно было сравнивать соседнии [i] и [i-1]
bool iResult = true; //Переменная результата, если true - ТОЛЬКО ОДНО СОВПАДЕНИЕ ЦИФР В СОСЕДНИХ ЭЛЕМЕНТАХ, иначе false
int F_El =0; //Не обязательно (проблемный элемент в котором условие не соблюдается)
for (int i=1;i<SizeM;i++)
{
int CoutEq = 0; //Количество совпадений , как я понял должно быть строго 1
for (int j=0;j<Cifr[i].size();j++)
{
for (int k=0; k<Cifr[i-1].size(); k++)
{
if (Cifr[i][j] == Cifr[i-1][k]) CoutEq++;
//cout<<Cifr[i][j]<<" ~ "<< Cifr[i-1][k]<<endl;
}
}
if (CoutEq != 1) { iResult = false; F_El = i;}
}

if (iResult)
{
cout<<"That is Ok!";
} else cout<<"False! Element : "<<F_El<<"and"<<F_El+1;


return -1;
}
 

DarkKnight

Well-known member
01.08.2010
653
0
#4
можно заменить примерно на:
strm<<Mass;
strm>>Cifr;
Выглядит красивей, и возможно, работать быстрее будет чем ваш вариант.

Да, если поток памяти юзать, действительно намного красивее будет выглядить :) , ну а выигрыш в скорости будет но не значительный :) Влюбом случае не для такого объема данных.
Вообщем реализация такая понравилась)

А так да, если выкинуть С++ из виду то char* тут в самый раз,только контроль размерности кол-ва цифр нужно реализовывать, я вектора просто люблю и на вставку (очередь) им цены нет, да и размерность всегда видна :)

C++:
//определение
//char**
char Cifr[SizeM] [12] ={0};
...
int Mods = Mass[i];
char Iter = 0;
while (Mods>9)
{
Cifr[i][Iter]=Mods%10 + 48; //Храним не число а его код, что бы конец строки Cif[i] - можно было определить иначе цифра 0 - будет определять понец

Mods /= 10;
Iter++; //Инкремент счетчика
}

Cifr[i][Iter]=Mods+48;


//Ну а проверка уже будет выглядить так
for (int i=1;i<SizeM;i++)
{
int CoutEq = 0; //Количество совпадений , как я понял должно быть строго 1
for (int j=0;j<strlen(Cifr[i]);j++)
{
for (int k=0; k<strlen(Cifr[i-1]); k++)
{
if (Cifr[i][j] == Cifr[i-1][k]) CoutEq++;
//cout<<Cifr[i][j]<<" ~ "<< Cifr[i-1][k]<<endl;
}
}