User:Xkrouhn
You are encouraged to solve this task according to the task description, using any language you may know.
Program to convert a decimal to fraction number.
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 will check whether a given positive integer is self-describing.
- As an optional stretch goal - generate and display the set of self-describing numbers.
BASIC
<lang qbasic> 'Program to transform a decimal to a fraction 'LRCVS 11.06.11
declare sub exacto (a$) declare sub puro (a$, b$()) declare sub mixto (a$, b$()) declare sub multiplo (a$)
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 y () as string dim w2 () as string
cls input "Decimal number = ";a$ print if instr(a$,".") = 0 then print "This is 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 'if b$(1) <> "" then print "repeticion = ";b$(1) 'print ll = len(a$) pp = instr(a$,".") d$ = mid$(a$,pp+1,ll) ps = instr(d$,b$(1)) if ps = 0 then
print "Exact decimal number " print call exacto (a$) end if
if ps = 1 then
print "Pure decimal number " print call puro (a$, b$()) end if
if ps > 1 then
print "Mixed decimal number " print call mixto (a$, b$()) end if
100: print print "End" sleep end
sub exacto (a$) 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 z$ = "0" g = int(val(a$)) h$ = right$(a$, b - c)
may = 0 j = 10^d k = val(h$) for n = 9 to 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 = 1 if j > k then may = j else may = k for n = 1 to may r = (j mod n) s = (k mod n) if r = 0 and s = 0 then l = n next n u = k/l v = j/l w = (g * v) + u 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, r, s, u, v, w, f, lr dim as string z, h, g1, x 'decimal puro z$ = b$(1) lr = len (z$) b2 = len (a$) c = instr (a$,".") g = int (val(a$)) b2 = len(z$) + 1 + len(str$(g)) a$ = str$(g) + "." + z$ h$ = right$(a$, b2 - c)
may = 0 x$ = "" for n = 1 to lr x$ = x$ + "9" next n
j = val(x$) k = val(h$) l = 1 for n = 9 to 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 if j > k then may = j else may = k for n = 1 to may
r = (j mod n) s = (k mod n) if r = 0 and s = 0 then l = n
next n u = k/l v = j/l w = (g * v) + u print w;"/";v ;" = ";w/v end sub
sub mixto (a as string, b() as string)
dim as integer b3, c, d, g, may, j, k, l, r, s, 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))
may = 0 j = b3 k = c for n = 9 to 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 if j > k then may = j else may = k for n = 1 to may
r = (j mod n) s = (k mod n) if r = 0 and s = 0 then l = n
next n 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 f = len(a$) j = 0 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
sub multiplo (a$) dim as integer j, b, c, g, h, k, n, u, v dim as string e,f cls print "Numero decimal exacto" print j = 0 b = len(a$) c = instr(a$,".") d = b - c e$ = str$(int(val(a$))) 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 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 for n = 1 to j * k if j mod n = 0 and k mod n = 0 then l = n :exit for next n u = k/l 'numerador v = j/l 'denominador print v;"/";u ;" = "; v / u end sub
end</lang>