1/1 1/2 1/3 1/4 1/5 ...
2/1 2/2 2/3 2/4
3/1 3/2 3/3
4/1 4/2
5/1
In the above diagram, the first term is 1/1, the second term is 1/2, the third term is 2/1, the fourth term is 3/1, the fifth term is 2/2, and so on.
Input
The input starts with a line containing a single integer t <= 20, the number of test cases. t test cases follow.
Then, it contains a single number per line.
Output
You are to write a program that will read a list of numbers in the range from 1 to 10^7 and will print for each number the corresponding term in Cantor's enumeration as given below.
Example
Input:
3
3
14
7
Output:
TERM 3 IS 2/1
TERM 14 IS 2/4
TERM 7 IS 1/4
https://www.spoj.pl/problems/CANTON/
import java.io.BufferedReader; import java.io.InputStreamReader; public class CountonCantor { public static void main( String args[] ) throws Exception { BufferedReader br = new BufferedReader( new InputStreamReader( System.in ) ); int numCasos = Integer.parseInt( br.readLine() ); int num, diagonalAnt, resto; for( int i = 0; i < numCasos; i ++ ) { num = Integer.parseInt( br.readLine() ); // Calculamos la diagonal anterior, mediante la formula: // diagonalAnt = Raiz( 2 * num ) - 1/2. // Esta formula es facilmente deducible. diagonalAnt = (int)( Math.sqrt( num << 1 ) - 0.5 ); resto = num - diagonalAnt * ( diagonalAnt + 1 )/2; /* * La respuesta depende de si la diagonal anterior es de posicion par * o impar. */ if( ( diagonalAnt & 1 ) == 0 ) System.out.println( "TERM " + num + " IS " + (diagonalAnt+2-resto) + "/" + resto ); else System.out.println( "TERM " + num + " IS " + resto + "/" + (diagonalAnt+2-resto) ); } } }
No hay comentarios:
Publicar un comentario