Per risolvere il primo problema basterebbe inserire il "<=" come condizione del for altrimenti, prendendo ad esempio il 26, dopo aver diviso per 2 intero varrà 13, ma il ciclo termina con d = 12.
Per evitare di inserire divisori che sono multipli di altri divisori mi sembra che un while annidato possa essere una buona soluzione: prima di passare all'iterazione successiva, incrementando d, continui a dividere intero per d fino a quando il resto della divisione è 0, facendo attenzione a non inserire il fattore più volte nella lista.