Convert decimal number to rational: Difference between revisions
(→{{header|BASIC}}: Add Python) |
|||
Line 22: | Line 22: | ||
'LRCVS 11.06.11 |
'LRCVS 11.06.11 |
||
'program to transform a decimal number to fraction |
|||
declare sub exacto (a$) |
declare sub exacto (a$) |
||
declare sub puro (a$, b$()) |
declare sub puro (a$, b$()) |
||
declare sub mixto (a$, b$()) |
declare sub mixto (a$, b$()) |
||
declare |
declare function factor (j , k ) as integer |
||
dim as integer l, r, s, t, k, w1, i, m, x, ll, pp, ps, u, v, j |
dim as integer l, r, s, t, k, w1, i, m, x, ll, pp, ps, u, v, j |
||
dim as string a, c, d |
dim as string a, c, d, a2 |
||
dim y () as string |
dim y () as string |
||
Line 36: | Line 37: | ||
cls |
cls |
||
input "Decimal number = ";a$ |
input "Decimal number = ";a$ |
||
⚫ | |||
print |
print |
||
if instr(a$,".") = 0 then print " |
if instr(a$,".") = 0 then print "It's not a decimal number " : goto 100 |
||
cls |
cls |
||
l = len(a$) |
l = len(a$) |
||
Line 87: | Line 89: | ||
next r |
next r |
||
print " |
print "decimal number = ";a$ |
||
print |
print |
||
'if b$(1) <> "" then print "repeticion = ";b$(1) |
|||
⚫ | |||
ll = len(a$) |
ll = len(a$) |
||
pp = instr(a$,".") |
pp = instr(a$,".") |
||
Line 96: | Line 97: | ||
ps = instr(d$,b$(1)) |
ps = instr(d$,b$(1)) |
||
if ps = 0 then |
if ps = 0 then |
||
print " |
print "Decimal number exact" |
||
print |
print |
||
call exacto (a$) |
call exacto (a$) |
||
end if |
end if |
||
if ps = 1 then |
if ps = 1 then |
||
print " |
print "Decimal number pure" |
||
print |
print |
||
call puro (a$, b$()) |
call puro (a$, b$()) |
||
Line 107: | Line 108: | ||
if ps > 1 then |
if ps > 1 then |
||
print " |
print "Decimal number mix" |
||
print |
print |
||
call mixto (a$, b$()) |
call mixto (a$, b$()) |
||
Line 117: | Line 118: | ||
end |
end |
||
':::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: |
|||
⚫ | |||
sub exacto (a as string) |
|||
dim as integer b, c, d, g, may, j, k, l, r, s, u, v, w, f |
dim as integer b, c, d, g, may, j, k, l, r, s, u, v, w, f |
||
dim as string z, h, g1 |
dim as string z, h, g1 |
||
Line 123: | Line 125: | ||
c = instr(a$,".") |
c = instr(a$,".") |
||
d = b - c |
d = b - c |
||
⚫ | |||
g = int(val(a$)) |
g = int(val(a$)) |
||
h$ = right$(a$, b - c) |
h$ = right$(a$, b - c) |
||
Line 130: | Line 131: | ||
j = 10^d |
j = 10^d |
||
k = val(h$) |
k = val(h$) |
||
for n = 9 to 1 |
for n = 9 to 1 step - 1 |
||
if j mod (1*(10^n)) = 0 and k mod (1*(10^n)) = 0 then j = j/(1*(10^n)) : k = k/(1*(10^n)) : |
if j mod (1*(10^n)) = 0 and k mod (1*(10^n)) = 0 then j = j/(1*(10^n)) : k = k/(1*(10^n)) :exit for |
||
next n |
|||
⚫ | |||
if j > k then may = j else may = k |
|||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
next n |
next n |
||
l = factor (j,k) |
|||
u = k/l |
u = k/l |
||
v = j/l |
v = j/l |
||
w = (g * v) + u |
w = (g * v) + u |
||
⚫ | |||
print w;"/";v ;" = " ;w/v |
print w;"/";v ;" = " ;w/v |
||
end sub |
end sub |
||
':::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: |
|||
sub puro (a as string, b() as string) |
sub puro (a as string, b() as string) |
||
dim as integer b2, c, d, g, may, j, k, l, |
dim as integer b2, c, d, g, may, j, k, l, u, v, w, f, lr,x5 |
||
dim as string z, h, g1, x |
dim as string z, h, g1, x, a3 |
||
'decimal puro |
|||
z$ = b$(1) |
z$ = b$(1) |
||
⚫ | |||
lr = len (z$) |
lr = len (z$) |
||
b2 = len (a$) |
b2 = len (a$) |
||
Line 156: | Line 155: | ||
g = int (val(a$)) |
g = int (val(a$)) |
||
b2 = len(z$) + 1 + len(str$(g)) |
b2 = len(z$) + 1 + len(str$(g)) |
||
a3$ = str$(g) + "." + z$ |
|||
h$ = right$( |
h$ = right$(a3$, b2 - c) |
||
may = 0 |
may = 0 |
||
x$ = "" |
x$ = "" |
||
for n = 1 to lr |
for n = 1 to lr |
||
Line 167: | Line 166: | ||
j = val(x$) |
j = val(x$) |
||
k = val(h$) |
k = val(h$) |
||
⚫ | |||
for n = 9 to 1 |
for n = 9 to 1 step - 1 |
||
if j mod (1*(10^n)) = 0 and k mod (1*(10^n)) = 0 then j = j/(1*(10^n)) : k = k/(1*(10^n)) : |
if j mod (1*(10^n)) = 0 and k mod (1*(10^n)) = 0 then j = j/(1*(10^n)) : k = k/(1*(10^n)) :exit for |
||
next n |
|||
if j > k then may = j else may = k |
|||
⚫ | |||
r = (j mod n) |
|||
s = (k mod n) |
|||
if r = 0 and s = 0 then l = n |
|||
next n |
next n |
||
l = factor (j,k) |
|||
u = k/l |
u = k/l |
||
v = j/l |
v = j/l |
||
w = (g * v) + u |
w = (g * v) + u |
||
print w;"/";v ;" = ";w/v |
print w;"/";v ;" = ";w/v |
||
⚫ | |||
print "Option >>> " |
|||
⚫ | |||
end sub |
end sub |
||
':::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: |
|||
sub mixto (a as string, b() as string) |
sub mixto (a as string, b() as string) |
||
dim as integer b3, c, d, g |
dim as integer b3, c, d, g, j, k, l, u, v, w, f, lr, lz, ly, x5 |
||
dim as string z, h, g4, g7, x, y |
dim as string z, h, g4, g7, x, y |
||
Line 197: | Line 196: | ||
b3 = (val(y$)*(9*(10^ly))) + ((1*(10^ly))* (val(z$))) |
b3 = (val(y$)*(9*(10^ly))) + ((1*(10^ly))* (val(z$))) |
||
c = (9*(10^ly))*(1*(10^ly)) |
c = (9*(10^ly))*(1*(10^ly)) |
||
⚫ | |||
j = b3 |
j = b3 |
||
k = c |
k = c |
||
for n = 9 to 1 |
for n = 9 to 1 step - 1 |
||
if j mod (1*(10^n)) = 0 and k mod (1*(10^n)) = 0 then j = j/(1*(10^n)) : k = k/(1*(10^n)) |
if j mod (1*(10^n)) = 0 and k mod (1*(10^n)) = 0 then j = j/(1*(10^n)) : k = k/(1*(10^n)): exit for |
||
next n |
next n |
||
l = factor (b3,c) |
|||
if j > k then may = j else may = k |
|||
⚫ | |||
for n = 1 to may |
|||
v = j/l |
|||
s = (k mod n) |
|||
if r = 0 and s = 0 then l = n |
|||
next n |
|||
⚫ | |||
v = j/l |
|||
if x5 <> 0 then print (x5*v)+ u;"/";u ;" = ";((x5*v)+ u)/u else print v;"/";u;" = "; v/u |
if x5 <> 0 then print (x5*v)+ u;"/";u ;" = ";((x5*v)+ u)/u else print v;"/";u;" = "; v/u |
||
print |
|||
f = len(a$) |
|||
print "Option >>> " |
|||
⚫ | |||
call exacto (a$) |
|||
if x5 <> 0 then g7$ = str$(((x5*v)+u)/u) else g7$ = str$(v/u) |
|||
if mid$(a$,1,f) <> mid$(g7$,1,f) then print ">>> error !!!" :j = 1 |
|||
if j = 1 then call multiplo (a$) |
|||
end sub |
end sub |
||
':::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: |
|||
function factor (j as integer, k as integer) as integer |
|||
sub multiplo (a$) |
|||
dim as integer |
dim as integer may, n, s, r, l5, j5, k5 |
||
⚫ | |||
dim as string e,f |
|||
⚫ | |||
cls |
|||
⚫ | |||
print "Numero decimal exacto" |
|||
⚫ | |||
⚫ | |||
⚫ | |||
j = 0 |
|||
⚫ | |||
b = len(a$) |
|||
c = instr(a$,".") |
|||
d = b - c |
|||
⚫ | |||
f$ = mid$(a$,c + 1 , d) |
|||
g = val(e$+f$) |
|||
h = 1*(10^d) |
|||
may = 0 'limite |
|||
j = g |
|||
k = h |
|||
if j > k then may = j else may = k |
|||
for n = 9 to 1 |
|||
⚫ | |||
next n |
next n |
||
if j5 > k5 then may = j5 else may = k5 |
|||
⚫ | |||
if j mod n = 0 and k mod n = 0 then l = n :exit for |
|||
⚫ | |||
⚫ | |||
⚫ | |||
next n |
next n |
||
factor = l5 |
|||
u = k/l 'numerador |
|||
end function |
|||
v = j/l 'denominador |
|||
print v;"/";u ;" = "; v / u |
|||
end sub |
|||
end</lang> |
end</lang> |
||
Revision as of 08:21, 12 June 2011
Program to convert a decimal number to fraction.
For transform a decimal to a fraction, previously we have to know what type is the decimal number, here are some examples
'Examples of types decimal numbers:
67 / 74 = 0.9054054 >>> Mixed decimal number
42 / 81 = 0.518518 >>> Pure decimal number
3/4 = 0.75 >>> Exact decimal number
- Task Description
- Write a function/routine/method/... that transform a decimal number to fraction.
BASIC
<lang qbasic> 'Program to transform a decimal to a fraction 'LRCVS 11.06.11
'program to transform a decimal number to fraction declare sub exacto (a$) declare sub puro (a$, b$()) declare sub mixto (a$, b$()) declare function factor (j , k ) as integer
dim as integer l, r, s, t, k, w1, i, m, x, ll, pp, ps, u, v, j
dim as string a, c, d, a2
dim y () as string dim w2 () as string
cls input "Decimal number = ";a$ a2$ = a$ print if instr(a$,".") = 0 then print "It's not a decimal number " : goto 100 cls l = len(a$)
for r = 1 to l for s = 1 to l if s + r = l + 2 then exit for k = k + 1 next s next r
w1 = k redim y$(w1) redim b$(w1)
k = 0 for r = 1 to l for s = 1 to l c$ = mid$(a$,r,s) if s + r = l + 2 then exit for if len(c$) <= int(l/2) then k = k + 1 : y$(k) = c$ next s next r t = 0
for r = 1 to k i = 0 f = 0 x = 0 m = 0 if i = 0 then i = instr(a$,y$(r)):x = 1 for s = 1 to len(a$) if x = 1 then f = instr(s,a$,y$(r)) if x = 1 and f > m then m = f next s
h = 0 k = 0 for n = i to m step len(y$(r)) if h = 0 and mid$(a$,n,len(y$(r))) = y$(r) then k = k + 1 else h = 1 next n if k > 1 then t = t + 1 :b$(t) = y$(r) next r
for r = 1 to w1 for s = r + 1 to w1 if b$(r) = b$(s) then b$(s) = "" next s next r
print "decimal number = ";a$ print
ll = len(a$) pp = instr(a$,".") d$ = mid$(a$,pp+1,ll) ps = instr(d$,b$(1)) if ps = 0 then
print "Decimal number exact" print call exacto (a$) end if
if ps = 1 then
print "Decimal number pure" print call puro (a$, b$()) end if
if ps > 1 then
print "Decimal number mix" print call mixto (a$, b$()) end if
100: print print "End" sleep end
':::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: sub exacto (a as string) dim as integer b, c, d, g, may, j, k, l, r, s, u, v, w, f dim as string z, h, g1 b = len(a$) c = instr(a$,".") d = b - c g = int(val(a$)) h$ = right$(a$, b - c)
may = 0 j = 10^d k = val(h$) for n = 9 to 1 step - 1 if j mod (1*(10^n)) = 0 and k mod (1*(10^n)) = 0 then j = j/(1*(10^n)) : k = k/(1*(10^n)) :exit for next n l = factor (j,k) u = k/l v = j/l w = (g * v) + u print print w;"/";v ;" = " ;w/v
end sub
':::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: sub puro (a as string, b() as string) dim as integer b2, c, d, g, may, j, k, l, u, v, w, f, lr,x5 dim as string z, h, g1, x, a3
z$ = b$(1) x5 = int(val(a$)) lr = len (z$) b2 = len (a$) c = instr (a$,".") g = int (val(a$)) b2 = len(z$) + 1 + len(str$(g)) a3$ = str$(g) + "." + z$ h$ = right$(a3$, b2 - c)
may = 0 x$ = "" for n = 1 to lr x$ = x$ + "9" next n
j = val(x$) k = val(h$)
for n = 9 to 1 step - 1 if j mod (1*(10^n)) = 0 and k mod (1*(10^n)) = 0 then j = j/(1*(10^n)) : k = k/(1*(10^n)) :exit for next n l = factor (j,k) u = k/l v = j/l w = (g * v) + u print w;"/";v ;" = ";w/v print print "Option >>> " call exacto (a$)
end sub
':::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: sub mixto (a as string, b() as string)
dim as integer b3, c, d, g, j, k, l, u, v, w, f, lr, lz, ly, x5 dim as string z, h, g4, g7, x, y
z$ = b$(1) x5 = int(val(a$)) w = instr(a$, z$) v = instr(a$,".") y$ = mid$(a$,v+1,w-v-1) lz = len(z$) ly = len(y$) b3 = (val(y$)*(9*(10^ly))) + ((1*(10^ly))* (val(z$))) c = (9*(10^ly))*(1*(10^ly)) j = b3 k = c for n = 9 to 1 step - 1 if j mod (1*(10^n)) = 0 and k mod (1*(10^n)) = 0 then j = j/(1*(10^n)) : k = k/(1*(10^n)): exit for next n l = factor (b3,c) u = k/l v = j/l if x5 <> 0 then print (x5*v)+ u;"/";u ;" = ";((x5*v)+ u)/u else print v;"/";u;" = "; v/u print print "Option >>> " call exacto (a$) end sub ':::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: function factor (j as integer, k as integer) as integer dim as integer may, n, s, r, l5, j5, k5 may = 0 l5 = 1 j5 = j k5 = k for n = 9 to 1 step - 1 if j5 mod (1*(10^n)) = 0 and k5 mod (1*(10^n)) = 0 then j5 = j5/(1*(10^n)) : k5 = k5/(1*(10^n)): exit for next n if j5 > k5 then may = j5 else may = k5 for n = may to 1 step - 1
r = (j5 mod n) s = (k5 mod n) if r = 0 and s = 0 then l5 = n :exit for
next n factor = l5 end function end</lang>
Python
Note that the decimal values of the task description are truncated in some cases.
The first loop limits the size of the denominator the second uses the Decimal module to convert an accurate Decimal representation of the given values to a fraction. <lang python>>>> from fractions import Fraction >>> for d in (0.9054054, 0.518518, 0.75): print(d, Fraction(d).limit_denominator(100))
0.9054054 67/74 0.518518 14/27 0.75 3/4 >>> from decimal import Decimal >>> for d in '0.9054054 0.518518 0.75'.split(): print(d, Fraction(Decimal(d)))
0.9054054 4527027/5000000 0.518518 259259/500000 0.75 3/4 >>> </lang>