Il ciclo for nel quale utilizzo la variabile key mi serve per riordinare gli elementi in ordine crescente in questo caso, e lo uso per non avere gli stessi numeri in posizioni diverse.
Premesso che non mi sono soffermato a capire cosa avviene realmente in quel doppio ciclo for, se il suo scopo è quello di ordinare l'array, allora è inutile in quanto il vettore data, per le modalità con cui viene riempito, risulta già ordinato.
Ora ho capito qual era il problema e al posto di data[a]!=1 ho messo n[0]!=1.
Ora il programma funziona, ma ci sono varie cose da ottimizzare:
- il suddetto doppio ciclo for come già detto risulta superfluo;
- affinché i divisori di un eventuale inserimento dopo il primo siano visualizzati correttamente, devi inizializzare la variabile div nuovamente a 0;
- il ciclo while in cui incrementi la variabile div può essere evitato se incrementi div nel ciclo for precedente. O meglio ancora puoi utilizzare per il ciclo for la variabile div al posto della variabile a;
- evita di utilizzare il system("PAUSE");
- il return 0 finale è superfluo e sostituirei il primo con un semplice break;
- se inserisci come primo numero 1 poi non hai la possibilità di uscire dal programma, aggiusterei quindi la parte relativa all'inserimento;
- l'unico motivo per cui utilizzi l'array n è che n[0] viene modificato e alla fine devi stampare n[1], ma se stampi il numero inserito dall'utente prima del ciclo for principale, basterebbe una semplice variabile al posto di un array di due elementi;
- un discorso simile può essere fatto per l'array data se stampi i divisori man mano che vengono trovati. In tal caso anche la variabile div non servirà più e il ciclo for principale può essere sostituito da un ciclo while.
Resta poi da ottimizzare la parte prettamente logica. Dopo posto quali sono i punti su cui intervenire.