Boas, eu estou a estudar eng informática e ainda sou um pouco verde no assunto.. Alguem me podia ajudar a resolver uma questao aula para avaliaçao?
Obrigado pela atençao de todos aqueles que se disponibilizarem
Um abraço a todos!
A questão é a seguinte:
Todos sabemos que algumas frações não têm uma representação finita com a notação decimal habitual. Por exemplo, 1/3 = 0.333... e nunca mais acabam os “3”; 1/7 = 0.142857142857... e este período “142857” repete-se indefinidamente.
Outras têm uma representação exacta: 1/2 = 0.5; 127/128 = 0.9921875; 3/40 = 0.075.
Das que não têm representação finita há algumas que têm uma parte inicial não repetitiva a que se segue a tal parte repetitiva, periódica. Por exemplo, 8/15 = 0.5333... Neste caso a parte inicial é “5” e a parte repetitiva é “3”. Outro exemplo: 19/44 = 0.43181818... Ou seja, a parte fixa é “43” e a parte repetitiva é “18”. Por outro lado, na verdade, as que têm representação finita têm também representação infinita periódica, só que a parte repetitiva é “0”. Por exemplo 1/4 = 0.25000…
Podemos pois generalizar, dizendo que qualquer fração própria (uma fração própria é uma fração em que o numerador e o denominador são positivos, sendo o numerador menor do que o denominador) tem uma representação decimal com uma parte não repetitiva, a cabeça, que pode ser vazia, e uma parte repetitiva, a cauda, que nunca é vazia. No caso de 1/3 a cabeça é vazia e a cauda é “3”; no caso de 3/40 a cabeça é “075” e a cauda é “0”; no caso de 19/44 a cabeça é “43” e a cauda é “18”.
Tarefa
Escreva um programa para calcular a cabeça e a cauda de uma fracção própria determinada pelo seu numerador e pelo seu denominador.
Input
O ficheiro de dados tem várias linhas, em número indeterminado. Em cada linha vêm dois números inteiros positivos, A e B. O número A representa o numerador de uma fração e o número B representa o denominador.
Output
Nos casos pequenos, em que a cauda tem até 25 algarismos, o programa deve escrever duas linhas para cada fração presente do ficheiro de entrada: na primeira linha vem a cabeça, entre “<” e “>”, e na segunda vem a cauda. Nos casos em que a cauda tem entre 26 e 400 algarismos, a cauda é escrita em linhas sucessivas, cada uma com 25 algarismos (exceto talvez a última, bem entendido). Nos casos em que a cauda tem mais que 400 algarismos, o programa deve escrever os 400 primeiros, em linhas de 25 algarismos, seguidas de uma linha que indica o número de algarismos que falta escrever, entre “(” e “)”.
Restrições
Numerador, A: 1 <= A, A <= 10000.
Denominador B: 1 <= B, B <= 10000, A < B.
Exemplo 1
Input
1 3
1 7
1 2
127 128
3 40
8 15
19 44
1 61
Output
<>
3
<>
142857
<5>
0
<9921875>
0
<075>
0
<5>
3
<43>
18
<>
0163934426229508196721311
4754098360655737704918032
7868852459
Exemplo 2
Input
519 8048
Output
<0644>
8807157057654075546719681
9085487077534791252485089
4632206759443339960238568
5884691848906560636182902
5844930417495029821073558
6481113320079522862823061
6302186878727634194831013
9165009940357852882703777
3359840954274353876739562
6242544731610337972166998
0119284294234592445328031
8091451292246520874751491
0536779324055666003976143
1411530815109343936381709
7415506958250497017892644
1351888667992047713717693
(102)
--------------------------------------------------------------
ate agora o que fiz
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <assert.h>
#include <ctype.h>
void ints_show(int *a, int n)
{
int i;
for (i = 0; i < n; i++)
printf(" %d", a[i]);
printf("\n");
}
void calculos(int a, int b)
{
int i=0;
int j=10;
int k=0;
int calculos[100000];
while(k<5)
{
calculos[i]=((a*j/b)%10);
if(calculos[i]==calculos[i-1]||calculos[i]==calculos[i-2])
{
k++;
}
j=j*10;
i++;
}
ints_show(calculos, i);
}
/*void ler(void)
{
if(
printf("<%d>", &calculos[]);
printf("%d", &calculos[v]);
*/
/*void detect(void)
{
int m;
for(m=0;m<0;m++)
*/
int main(void)
{
//int d = ((3*1000/4))%10;
//printf("%d\n",d);
calculos(3, 40);
return 0;
}
Obrigado pela atençao de todos aqueles que se disponibilizarem
Um abraço a todos!
A questão é a seguinte:
Todos sabemos que algumas frações não têm uma representação finita com a notação decimal habitual. Por exemplo, 1/3 = 0.333... e nunca mais acabam os “3”; 1/7 = 0.142857142857... e este período “142857” repete-se indefinidamente.
Outras têm uma representação exacta: 1/2 = 0.5; 127/128 = 0.9921875; 3/40 = 0.075.
Das que não têm representação finita há algumas que têm uma parte inicial não repetitiva a que se segue a tal parte repetitiva, periódica. Por exemplo, 8/15 = 0.5333... Neste caso a parte inicial é “5” e a parte repetitiva é “3”. Outro exemplo: 19/44 = 0.43181818... Ou seja, a parte fixa é “43” e a parte repetitiva é “18”. Por outro lado, na verdade, as que têm representação finita têm também representação infinita periódica, só que a parte repetitiva é “0”. Por exemplo 1/4 = 0.25000…
Podemos pois generalizar, dizendo que qualquer fração própria (uma fração própria é uma fração em que o numerador e o denominador são positivos, sendo o numerador menor do que o denominador) tem uma representação decimal com uma parte não repetitiva, a cabeça, que pode ser vazia, e uma parte repetitiva, a cauda, que nunca é vazia. No caso de 1/3 a cabeça é vazia e a cauda é “3”; no caso de 3/40 a cabeça é “075” e a cauda é “0”; no caso de 19/44 a cabeça é “43” e a cauda é “18”.
Tarefa
Escreva um programa para calcular a cabeça e a cauda de uma fracção própria determinada pelo seu numerador e pelo seu denominador.
Input
O ficheiro de dados tem várias linhas, em número indeterminado. Em cada linha vêm dois números inteiros positivos, A e B. O número A representa o numerador de uma fração e o número B representa o denominador.
Output
Nos casos pequenos, em que a cauda tem até 25 algarismos, o programa deve escrever duas linhas para cada fração presente do ficheiro de entrada: na primeira linha vem a cabeça, entre “<” e “>”, e na segunda vem a cauda. Nos casos em que a cauda tem entre 26 e 400 algarismos, a cauda é escrita em linhas sucessivas, cada uma com 25 algarismos (exceto talvez a última, bem entendido). Nos casos em que a cauda tem mais que 400 algarismos, o programa deve escrever os 400 primeiros, em linhas de 25 algarismos, seguidas de uma linha que indica o número de algarismos que falta escrever, entre “(” e “)”.
Restrições
Numerador, A: 1 <= A, A <= 10000.
Denominador B: 1 <= B, B <= 10000, A < B.
Exemplo 1
Input
1 3
1 7
1 2
127 128
3 40
8 15
19 44
1 61
Output
<>
3
<>
142857
<5>
0
<9921875>
0
<075>
0
<5>
3
<43>
18
<>
0163934426229508196721311
4754098360655737704918032
7868852459
Exemplo 2
Input
519 8048
Output
<0644>
8807157057654075546719681
9085487077534791252485089
4632206759443339960238568
5884691848906560636182902
5844930417495029821073558
6481113320079522862823061
6302186878727634194831013
9165009940357852882703777
3359840954274353876739562
6242544731610337972166998
0119284294234592445328031
8091451292246520874751491
0536779324055666003976143
1411530815109343936381709
7415506958250497017892644
1351888667992047713717693
(102)
--------------------------------------------------------------
ate agora o que fiz
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <assert.h>
#include <ctype.h>
void ints_show(int *a, int n)
{
int i;
for (i = 0; i < n; i++)
printf(" %d", a[i]);
printf("\n");
}
void calculos(int a, int b)
{
int i=0;
int j=10;
int k=0;
int calculos[100000];
while(k<5)
{
calculos[i]=((a*j/b)%10);
if(calculos[i]==calculos[i-1]||calculos[i]==calculos[i-2])
{
k++;
}
j=j*10;
i++;
}
ints_show(calculos, i);
}
/*void ler(void)
{
if(
printf("<%d>", &calculos[]);
printf("%d", &calculos[v]);
*/
/*void detect(void)
{
int m;
for(m=0;m<0;m++)
*/
int main(void)
{
//int d = ((3*1000/4))%10;
//printf("%d\n",d);
calculos(3, 40);
return 0;
}