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