07 Fév2016
Fichier : Nombres opposés
Objectif :
- Lecture et écriture dans un fichier.
- Manipulation des collections.
- Exploiter la classe StringTokenizer.
Énonce :
Etant donné un tableau d'entiers non nuls, trouvez combien il y a d'entiers distincts positifs dont l'opposé est aussi dans le tableau.
Par exemple, pour le tableau de taille 15 qui suit:
-3 4 2 8 9 1 -3 -8 -4 2 8 2 -8 1 3
il faut afficher 3. En effet, les trois entiers 3, 4, et 8 ont aussi leur opposé dans le tableau.
LIMITES DE TEMPS ET DE MEMOIRE
Temps : 1s sur une machine à 1Ghz.
Mémoire : 16000 Ko.
CONTRAINTES
- 1 <= N <= 20000, où N est le nombre d'éléments du tableau.
- -10<SUP>8</SUP> < X < 10<SUP>8</SUP>, et X différent de 0, où X est un élément du tableau.
De plus, dans 50% des tests, on a :
- 1 <= N <= 1000.
ENTRÉE
- La première ligne de l'entrée contient un entier N, la taille du tableau.
- La deuxième ligne contient N entiers séparés par des espaces : les éléments du tableau.
SORTIE
Vous devez écrire une ligne sur la sortie, contenant un entier K : le nombre d'entiers distincts X > 0, tels que X et –X appartiennent tous les deux au tableau.
EXEMPLE
entrée :
15
-3 4 2 8 9 1 -3 -8 -4 2 8 2 -8 1 3
sortie :
3
Solution :
import java.io.*; import java.util.Iterator; import java.util.Set; import java.util.StringTokenizer; import java.util.TreeSet; public class NombresOpposes { public static void main(String[] args) throws IOException { BufferedReader in = new BufferedReader(new FileReader("file/in.txt")); PrintWriter out = new PrintWriter(new FileWriter("file/out.txt")); int n = Integer.parseInt(in.readLine().toString()); StringTokenizer st = new StringTokenizer(in.readLine(), " "); Set<Integer> set = new TreeSet<Integer>(); Set<Integer> set2 = new TreeSet<Integer>(); while (st.hasMoreElements()) { set.add(Integer.parseInt(st.nextElement().toString())); } int size1 = set.size(); Iterator<Integer> it = set.iterator(); while (it.hasNext()) { set2.add(Math.abs(it.next())); } out.println(size1 - set2.size()); out.close(); in.close(); } }