Можно ли как-то объединить последние 2 цикла в один?

ifstream F;
ofstream F1;
string name1,name2;
int n, k,i=0,j=0,tmp,x;
pt >> name1 >> name2;
F.open(name1.c_str(), ios::in);
F >> n >> k;
    int* a = new int[n];
while (!F.eof() && i!=n) {
    F >> a[i];
    i++;
}
F.close();
F1.open(name2.c_str(), ios::out);
for (i = 0; i < n; i++) {
    F1 << a[i] << " ";
}
F1 << endl;
F1 << "" << endl;
for (i = 0; i < n; i++) {
    if (abs(a[i])%k==0) {
        for (j = i; j < n; j++)
            a[j] = a[j + 1];
        n--; i--;
    }
    F1 << a[i] << " ";
}
for (i = 0; i < n; i++) {
    if (a[i]==a[i+1]) {
        for (j = i; j < n ; j++)
            a[j] = a[j + 1];
        n--; i--;
    }
    F1 << a[i] << " ";
}
F1.close();

Ответы (3 шт):

Автор решения: avkouzbar

Вам нужно объединить условия abs(a[i])%k==0) && (a[i]==a[i+1]) в рамках одного цикла.

→ Ссылка
Автор решения: Ilya Laptev
hg = 0;   // Вначале это позиция, в которую отправляем оставшийся элемент.// Затем hg будет означать количество оставшихся после удаления элементов.
   for (i = 0; i < n; i++){
       if (!(abs(a[i]) % k == 0)) {  // условие не на удаление элемента из массива, а на оставление (!!) его в массиве
           a[hg] = a[i];
           hg++;
       }
   }
   for (i = 0; i < hg; i++)
       F1 << a[i] << " ";
   F1.close();
→ Ссылка
Автор решения: n1tr0xs

Да, можно. Вместо двух последних циклов можно написать такой один:

for (int i = 0; i < n; ++i) {
    if ((!abs(a[i])%k) || (a[i]==a[i+1])) {
        for (int j = i; j < n; ++j)
            a[j] = a[j+1];
        --n; --i;
    }
    F1 << a[i] << " ";
}
→ Ссылка