Division des nombres pas si petits


15

Ecrire un programme ou une fonction qui prend en nombres entiers positifs a, bet c, et des impressions ou des retours a/bà cdécimales, en utilisant les opérations + - * /% [ajouter, soustraire, multiplier, diviser, modulent] sur les nombres entiers positifs: vous pouvez utiliser tout ce qui votre langue le permet, mais pas sur les nombres à virgule flottante. La plage de a, b, c serait la plage autorisée pour les entiers non signés dans votre langue. Le résultat numérique sera tronqué au dernier chiffre à imprimer (donc non round).

Cela signifie que si votre langue n'a pas de type entier (flottant uniquement), vous pouvez participer en utilisant ces nombres flottants uniquement comme des entiers positifs. L'indice de cet exercice serait d'écrire la fonction qui trouve les chiffres dans une division en virgule flottante, en utilisant uniquement l'opération + - * /% sur des entiers [non signés].

Exemples

  • print(1,2,1) imprimerait 0.5
  • print(1,2,2) imprimerait 0.50
  • print(13,7,27) imprimerait 1.857142857142857142857142857
  • print(2,3,1) imprimerait 0.6
  • print(4,5,7) imprimerait 0.8000000
  • print(4,5,1) imprimerait 0.8
  • print(9999,23,1) imprimerait 434.7
  • print(12345613,2321,89) imprimerait si votre langue a 32 bits non signés 5319.09220163722533390779836277466609220163722533390779836277466609220163722533390779836277466

Le code le plus court en octets gagne. Je suis désolé si cela n'apparaît pas clairement ... Je ne connais pas non plus les langues, je ne me souviens pas bien des mots ... Il vaut mieux avoir un lien vers Ideone.com ou un autre endroit pour essayer facilement la réponse spécialement pour tester une entrée différente de celle proposée.


1
Quelle est la plage des entiers a, b, c?
Ton Hospel

@Ton Hospel la plage de a, b, c serait la plage autorisée pour un entier non signé dans votre langue: par exemple, s'il s'agit d'un 32 bits non signé, ce serait 0..0xFFFFFFFF mais si c> = 0xFFFFFFF si grand la sortie serait soyez un peu lent ...
RosLuP

2
Il s'agit d'une fonction d'arrondi - ou, plus précisément, elle doit être une fonction d'arrondi pour être correctement spécifiée. À l'heure actuelle, on ne sait pas quelle serait la bonne réponse, par exemple (1,2,0). Voir meta.codegolf.stackexchange.com/a/5608/194
Peter Taylor

1
Désolé d'avoir rouvert cette question; Je pense qu'il est presque prêt à être rouvert, à l'exception du problème signalé par Peter Taylor. Quelle est la sortie fo (1,2,0)?
ETHproductions

2
En fait, cela (1,2,0)ne devrait pas être pertinent car ce 0n'est pas un entier positif. Et je préférerais que c reste comme ça puisque je préfère ne pas avoir à penser à ajouter un .ou pas
Ton Hospel

Réponses:


5

05AB1E , 17 13 11 19 14 octets

Saisie dans le formulaire b, a, c.
Enregistré 5 octets grâce à Grimy .

‰`¹+I°*¹÷¦'.sJ

Essayez-le en ligne!


Je viens de l'essayer en ligne avec l'entrée 13,7,27 et la réponse n'est pas correcte
Mathieu J.

@shigazaru: Il renvoie le même résultat que les cas de test. Avez-vous remarqué l'ordre des entrées b,a,c?
Emigna

J'essaie le bouton "Essayer en ligne" où il y a cette division: 12345613/2321 avec 89 chiffres, mais le résultat il y a quelque chose comme 5319.922 ... au lieu de 5319.0922 ...
RosLuP

1
15:‰`I°*¹÷I°+¦'.sJ
Grimmy

2
14:‰`¹+I°*¹÷¦'.sJ
Grimmy

4

Haskell, 87 octets

(a#b)c|s<-show$div(a*10^c)b,l<-length s-c,(h,t)<-splitAt l s=['0'|l<1]++h++['.'|c>0]++t

Exemple d'utilisation: (13#7)27-> "1.857142857142857142857142857".

23 octets pour gérer le c==0cas et utiliser un zéro non significatif au lieu de choses comme .5.

Comment ça marche: multiplier aavec 10^c, diviser par b, transformer en une chaîne, diviser où le .doit être inséré, joindre les deux parties avec un .entre-deux et fixer les cas de bord.


4

Perl 6 ,  58 57 55  48 octets

{(($^a.FatRat/$^b*10**$^c).Int.FatRat/10**$c).base(10,$c)}
{(Int($^a.FatRat/$^b*10**$^c).FatRat/10**$c).base(10,$c)}
{base Int($^a.FatRat/$^b*10**$^c).FatRat/10**$c: 10,$c}
{base ($^a*10**$^c div$^b).FatRat/10**$c: 10,$c}

Ce qui est assez ennuyeux, c'est qu'il pourrait être réduit à juste {($^a.FatRat/$^b).base(10,$^c)}s'il était autorisé à arrondir à la valeur la plus proche.

Explication:

# bare block lambda with 3 placeholder parameters 「$^a」, 「$^b」 and 「$^c」
{
  (
    (

      # create an Int containing all of the digits we care about
      $^a * 10 ** $^c div $^b

    ).FatRat / 10**$c  # turn it into a Rational

  ).base( 10, $c )     # force it to display 「$c」 digits after the decimal point
}

Je ne connais pas perl6, mais n'est-ce pas (...).FatRat / 10**$xune division d'un rationnel? Vous n'êtes autorisé qu'à diviser des entiers.
nimi

@nimi a Rational est une classe avec deux Ints .
Brad Gilbert b2gills

Les opérateurs mathématiques ne sont autorisés que pour les types entiers et non pour les autres types numériques. Citation: "L'indice de cet exercice ... pour écrire la fonction ... en utilisant uniquement l'opération + - * /% sur des entiers [non signés]."
nimi

@nimi Donc, si j'écrivais une réimplémentation de Rational, et que je n'en ajoutais pas does Realou does Numericce serait autorisé? Et si j'augmente (patch de singe) la classe existante pour supprimer ces rôles, cela serait-il autorisé?
Brad Gilbert b2gills

Je ne sais pas. J'ai lu la spécification comme dit précédemment: +-*/%uniquement avec des types entiers simples. "entier simple" en termes de fonctionnalité (tout d'abord: division entière) et non de représentation interne. Pensez-vous qu'il est autorisé d'utiliser une bibliothèque logicielle à virgule flottante qui, malgré son nom, n'utilise également que des entiers pour la représentation interne?
nimi

3

Perl, 55 octets

Comprend +3 pour -p

Donnez a et b sur une ligne sur STDIN, c sur la suivante

division.pl
1 26
38
^D

division.pl:

#!/usr/bin/perl -p
eval'$\.=($_/$&|0)."."x!$\;$_=$_%$&.0;'x(/ .*/+<>)}{

l' $_/$&est un peu défendables de. Je veux en fait une division entière mais perl n'en a pas sans charger des modules spéciaux. C'est donc temporairement un non-entier que je tronque immédiatement (en utilisant |0) donc je me retrouve avec l'entier qu'une division entière donnerait. Il pourrait être réécrit ($_-$_%$&)/$&afin de ne pas avoir même temporairement une valeur non entière (ce serait cependant en interne un flottant)


Pourriez-vous utiliser $-pour le faire uniquement int? (Je pense qu'il y a des limites strictes sur le mix / max de celui-ci, et je suis sûr que vous l'auriez déjà envisagé, mais cela mérite d'être vérifié!)
Dom Hastings

@DomHastings Ce serait toujours un tronçon après avoir fait une division en virgule flottante. Perl n'a tout simplement pas de division entière sansuse integer
Ton Hospel

Ah, donc c'est juste masqué $-, bon à savoir. Merci!
Dom Hastings

3

JavaScript (ES6), 55 50 octets

f=(a,b,c,d=".")=>~c?(a/b|0)+d+f(a%b*10,b,c-1,""):d

(a/b|0)effectue la division flottante mais transforme immédiatement en un entier. Veuillez me faire savoir si cela n'est pas autorisé.


3

PHP, 187 octets

fonctionne avec des chaînes pour le numérateur qui peuvent être des valeurs int supérieures à PHP_INT_MAX

list(,$n,$d,$c)=$argv;$a=str_split($n);while($a){$n.=array_shift($a);if($n>=$d||$r)$n-=$d*$r[]=$n/$d^0;}if(!$r)$r[]=0;if($c)$r[]=".";while($c--){$n*=10;$n-=$d*$r[]=$n/$d^0;}echo join($r);

Je n'ai aucune autre chance alors 13/7 est raccourci à 1.8571428571429 et j'atteins donc pas le cas de test avec 27 décimales

De cette façon, 36 octets ne sont pas autorisés

<?=bcdiv(($z=$argv)[1],$z[2],$z[3]);

la division des flotteurs n'est pas autorisée selon l'OP
Maltysen

@Maltysen Désolé, je fais un retour en arrière. J'avais tellement peur de trouver une solution plus courte que je ne la reconnais pas contre la spécification.
Jörg Hülsermann

2

Pyth - 21 19 18 16 14 octets

Sera à la recherche sur le format d'entrée, qui peut prolly enregistrer un tas.

j\.c`/*E^TQE]_

Suite de tests . (PS le 27 ne termine pas en ligne, donc j'en ai fait 10 à la place).


@Emigna n'a pas non plus à le faire car ce 0n'est pas un entier positif (même si l'op continue d'ajouter des exemples avec c=0)
Ton Hospel

@TonHospel: Ah, en effet. Je regardais les exemples. Je peux alors raccourcir ma réponse :)
Emigna

Ne fonctionne pas avec les nombres qui ont un 0 en tête après le point décimal, par exemple 2/21 à 10 décimales.
Emigna

2/21 avec 10 chiffres imprime seulement 9 chiffres après le point
RosLuP

2/21 avec 10 chiffres comme Emigna dit au lieu de 0,09 ... imprimer 0,9 ...
RosLuP

2

JavaScript (ES6),  64  62 59 octets

Sauvegardé 2 octets grâce à ETHproductions.

La division incluse donne toujours un entier.

f=(a,b,n,s)=>~n?f((q=(a-a%b)/b,a%b*10),b,n-1,s?s+q:q+'.'):s

console.log(f(13,7,27))


Est-ce que sauter mcomplètement fonctionnerait toujours? f=(a,b,n,s)=>n+1?f((q=(a-a%b)/b,a%b*10),b,n-1,s?s+q:q+'.'):sest de 60 octets.
ETHproductions

@ETHproductions - En effet. Merci!
Arnauld

2

Java 7, 105 octets

import java.math.*;String c(int...a){return new BigDecimal(a[0]).divide(new BigDecimal(a[1]),a[2],3)+"";}

Code non testé et testé:

Essayez-le ici.

import java.math.*;
class M{
  static String c(int... a){
    return new BigDecimal(a[0]).divide(new BigDecimal(a[1]), a[2], 3)+"";
  }

  public static void main(String[] a){
    System.out.println(c(1, 2, 1));
    System.out.println(c(1, 2, 2));
    System.out.println(c(13, 7, 27));
    System.out.println(c(2, 3, 1));
    System.out.println(c(4, 5, 7));
    System.out.println(c(4, 5, 0));
    System.out.println(c(9999, 23, 0));
    System.out.println(c(12345613, 2321, 89));
  }
}

Production:

0.5
0.50
1.857142857142857142857142857
0.6
0.8000000
0
434
5319.09220163722533390779836277466609220163722533390779836277466609220163722533390779836277466

Je ne pense pas que ce soit valide, car il s'agit essentiellement d'une division en virgule flottante, même si elle est appelée divideet non /.
corvus_192

@ corvus_192 Une autre réponse Java supprimée postée plus tard que moi avait le raisonnement, que je vais copier-coller ici (le crédit de cette explication va à @SocraticPhoenix ): " Comment ça marche: Java BigDecimals sont implémentés en tant que BigIntegers, avec une échelle. Il s'agit techniquement d'une virgule flottante, mais les objets BigInteger et BigDecimal utilisent uniquement le inttype pour stocker la valeur numérique. (N'est-ce pas cool? BigInteger est un nombre int[]de chiffres. Par exemple, {1,2,5} en base 10 est 125. I Je ne sais pas dans quelle base se trouvent les chiffres de BigInteger, mais je suppose que c'est plus de 10. "
Kevin Cruijssen

2

Rubis, 67 octets

->(a,b,c){('0'+(a*10**c/b).to_s).gsub(/^0*(.+)(.{#{c}})$/,'\1.\2')}

si j'en fais une fonction pour exécuter les cas de test ci-dessus

def print(a,b,c); ('0'+(a*10**c/b).to_s).gsub(/^0*(.+)(.{#{c}})$/, '\1.\2'); end
 => :print 
print(1,2,1)   # would print 0.5
 => "0.5" 
print(1,2,2)   # would print 0.50
 => "0.50" 
print(13,7,27) # would print 1.857142857142857142857142857
 => "1.857142857142857142857142857" 
print(2,3,1)   # would print 0.6
 => "0.6" 
print(4,5,7)   # would print 0.8000000
 => "0.8000000" 
print(4,5,1)   # would print 0.8
 => "0.8" 
print(9999,23,1) # would print 434.7
 => "434.7" 
print(12345613,2321,89) # would print if your Language has 32 bit unsigned 5319.09220163722533390779836277466609220163722533390779836277466609220163722533390779836277466
 => "5319.09220163722533390779836277466609220163722533390779836277466609220163722533390779836277466" 
"('0'+(a*10**c/b).to_s).gsub(/^0*(.+)(.{#{c}})$/, '\1.\2')".length
 => 52 

Bienvenue au code golf! Pour la plupart des langages, lorsque vous définissez une fonction, vous devez la définir complètement et vous ne pouvez pas vous fier à l'hypothèse qu'il existe des variables prédéfinies comme celle-ci. Dans Ruby, le moyen le plus court de définir un lambda est de ->a,b,c{...}remplacer les ellipses par votre code. (L'affectation réelle de la variable n'est pas nécessaire par consensus.)
Value Ink

merci, j'avais la mauvaise impression que d'autres avaient omis cette partie ... mais vous avez raison. Je viens de l'ajouter.
Mathieu J.21

2

Raquette 203 octets

(let*((s(~r(/ a b)#:precision c))(sl(string-split s "."))(s2(list-ref sl 1))(n(string-length s2)))
(if(< n c)(begin(for((i(- c n)))(set! s2(string-append s2 "0")))(string-append(list-ref sl 0)"."s2))s))

Non golfé:

(define (f a b c)
  (let* ((s (~r(/ a b)#:precision c))
         (sl (string-split s "."))
         (s2 (list-ref sl 1))
         (n (string-length s2)))
    (if (< n c)
        (begin 
          (for ((i (- c n)))
            (set! s2 (string-append s2 "0")))
          (string-append (list-ref sl 0) "." s2))
        s )))

Usage:

(f 7 5 3)
(f 1 2 1) 
(f 1 2 2) 
(f 13 7 27)

Production:

"1.400"
"0.5"
"0.50"
"1.857142857142857142857142857"

Autre méthode (réponse non valable ici):

(real->decimal-string(/ a b)c)

Je crains que cela ne soit pas valide, car real->decimal-stringattend une realvaleur comme premier argument, tout /comme la division en virgule flottante, ce qui n'est pas autorisé dans cette tâche. Aussi: real->decimal-stringarrondit ( (f 1 6 7)-> 0.1666667) au lieu de tronquer.
nimi

Merci pour les observations. Je corrigerai bientôt le code.
rnso

1

q, 196 octets

w:{((x 0)div 10;1+x 1)}/[{0<x 0};(a;0)]1;{s:x 0;m:x 2;r:(10*x 1)+$[m<0;{x*10}/[-1*m;a];{x div 10}/[m;a]]mod 10;d:1#.Q.s r div b;($[m=-1;s,".",d;$[s~,:'["0"];d;s,d]];r mod b;m-1)}/[c+w;("";0;w-1)]0

Pour exécuter: définissez d'abord a, b, c.


1

Rouille, 114 octets

fn print(mut a:u32,b:u32,c:u32){let mut p=||{print!("{}",a/b);a=a%b*10};p();if c>0{print!(".")}for _ in 0..c{p()}}

code de test:

fn main() {
    print(1, 2, 1);    println!(""); // should print 0.5
    print(1, 2, 2);    println!(""); // should print 0.50
    print(13, 7, 27);  println!(""); // should print 1.857142857142857142857142857
    print(2, 3, 1);    println!(""); // should print 0.6
    print(4, 5, 7);    println!(""); // should print 0.8000000
    print(4, 5, 0);    println!(""); // should print 0
    print(9999, 23, 0);println!(""); // should print 434
    print(12345613,2321,89); println!("\n");  // 5319.09220163722533390779836277466609220163722533390779836277466609220163722533390779836277466
}

1

PHP, 89 octets

list(,$a,$b,$c)=$argv;for($o=intdiv($a,$b).'.';$c--;)$o.=intdiv($a=10*($a%$b),$b);echo$o;

intdiv () est introduit en php 7 donc il nécessite cela. php 7.1 me permettrait de changer la liste () en [] et économiserait ainsi 4 octets.

utiliser comme:

php -r "list(,$a,$b,$c)=$argv;for($o=intdiv($a,$b).'.';$c--;)$o.=intdiv($a=10*($a%$b),$b);echo$o;" 1 2 1

remplacer $o.=intdiv($a=10*($a%$b),$b);par $o.=($a=10*($a%$b))/$b^0;économisera 4 octets.
Jörg Hülsermann

Au départ, j'allais suivre ce conseil (j'ai édité la réponse et tout) mais à la réflexion, il s'agit d'une division en virgule flottante, puis d'un cast en int, donc pour une augmentation de <10% de la longueur, je préfère m'en tenir complètement aux spécifications de la question.
user59178

1

C #, 126 octets

(a,b,c)=>{var v=a*BigInteger.Parse("1"+new string('0',c))/b+"";return v.PadLeft(c+1,'0').Insert(Math.Max(1,v.Length-c),".");};

Programme complet avec cas de test:

using System;
using System.Numerics;

namespace DivisionOfNotSoLittleNumbers
{
    class Program
    {
        static void Main(string[] args)
        {
            Func<BigInteger,BigInteger,int,string>f= (a,b,c)=>{var v=a*BigInteger.Parse("1"+new string('0',c))/b+"";return v.PadLeft(c+1,'0').Insert(Math.Max(1,v.Length-c),".");};

            //test cases:
            Console.WriteLine(f(1,2,1));    //0.5
            Console.WriteLine(f(1,2,2));    //0.50
            Console.WriteLine(f(13,7,27));  //1.857142857142857142857142857
            Console.WriteLine(f(2,3,1));    //0.6
            Console.WriteLine(f(4,5,7));    //0.8000000
            Console.WriteLine(f(4,5,1));    //0.8
            Console.WriteLine(f(9999,23,1));    //434.7
            Console.WriteLine(f(12345613,2321,89)); //5319.09220163722533390779836277466609220163722533390779836277466609220163722533390779836277466
            Console.WriteLine(f(2,3,1));    //0.6
            Console.WriteLine(f(4,5,2));    //0.80
        }
    }
}

La division entière est implémentée. Des nombres de n'importe quelle taille peuvent être utilisés, en raison du BigIntegertype de données (l'importation System.Numericsest requise). Le paramètre de nombre de chiffres cest limité à 2 ^ 31-1, mais il doit fournir plus qu'assez de chiffres.


1

Groovy ( 78 77 42 octets)

{a,b,n->Eval.me(a+'.0g').divide(b, n, 1)}​

Explication

Eval.me(a+'.0g');- Conversion de l'entrée entière en entrée BigDecimal. En groovy, la notation BigDecimal est une notation double avec un G ou g ajouté. J'aurais aussi pu utiliser le constructeur new BigDecimal(it)mais cela a sauvé un octet.
.divide(b, n, 1)- Divisez par b avec n précision, mode d'arrondi à moitié.

Essayez-le ici: https://groovyconsole.appspot.com/script/5177545091710976


Mais BigDecimal prend en charge le fonctionnement en virgule flottante qui, sauf erreur de ma part, a été, je crois, indiqué comme étant interdit pour cet exercice.
Mathieu J.21

1

Lot, 122 octets

@set/as=%1/%2,r=%1%%%2
@set s=%s%.
@for /l %%a in (1,1,%3)do @set/ad=r*10/%2,r=r*10%%%2&call set s=%%s%%%%d%%
@echo %s%

1

Mathematica, 50 octets

StringInsert[ToString@Floor[10^# #2/#3],".",-#-1]&

Fonction Sans nom de trois arguments (qui sont commandés c, a, bpour sauver un quelque part octet), qui renvoie une chaîne. Il multiplie a/bpar 10^c, prend la plus grande fonction entière, puis se convertit en chaîne et insère une virgule décimale à l'endroit approprié. Dommage que les noms de fonction ne soient pas plus courts.


1

Python 3, 62 octets

a,b,c=map(int,input().split());print("{:.{1}f}".format(a/b,c))

Essayez-le ici

* Remarque : repl.it utilise une version plus ancienne de Python 3 , qui nécessite que tous les indices de champ soient spécifiés, ce "{:.{1}f}"qui signifie que ce sera le cas "{0:.{1}f}", ce qui en fait 63 octets dans repl.it

Comment utiliser

Entrez les trois valeurs avec des espaces entre les deux. c'est-à-dire qu'une entrée de 1 2 1donnerait un résultat de0.5

Explication

input().split(): Obtient une entrée utilisateur et la divise en une liste avec un séparateur de (espace)

a,b,c = map(int,XX): Mappe les variables dans les valeurs spécifiées par l'utilisateur avec un type int

"{:.{1}f}".format(a/b,c): Formate une chaîne pour afficher le résultat de la division et remplace {1}parc pour définir la décimale de la chaîne affichée

print(XX): imprime la chaîne fournie


1

Python 3 , 58 octets

lambda a,b,c:(lambda s:s[:-c]+"."+s[-c:])(str(a*10**c//b))

Essayez-le en ligne!

Ceci est précis pour le nombre de décimales spécifié tant que a * 10 ** c n'est pas trop grand.

J'ai essayé Python 2 pour raccourcir le str(...)to `...`mais Python 2 insère un Là la fin s'il est trop grand, donc la vérification prendrait bien plus d'octets que cela ne vaut.


1

Stax , 13 octets

ä·oαì█↕▬AS¥é▼

Exécuter et déboguer

Les arguments sont acceptés dans l' c a bordre.


Le problème serait le cas "print (9999,23,1)" le résultat imprimé dans le message est "434.7" tandis que votre résultat semble "4.7" le même que le dernier cas: 5319.092201etc au lieu de 9.092201etc
RosLuP

Je ne suis pas d'accord ... J'ai suivi ce matin votre lien et le résultat pour le cas "print (9999,23,1)" dans votre ordre de fonction était 4,7 et non 434,7
RosLuP

@RosLuP: J'ai changé d'approche. Le résultat est maintenant correctement `434.7`. J'ai également réduit la taille d'un octet dans le processus.
récursif

0

C, 67 octets

h(a,b,i){int j=!i;for(;printf(j++?"%u":"%u.",a/b),i--;a=10*(a%b));}

Essayez-le en ligne!

Une version précédente, je pense, avait un bug dans la mémoire de lecture qui n'était pas affecté au programme ... Merci à plafondcat et pour tous ...


@ceilingcat ok merci
RosLuP

J'aime le dernier 69 octets
RosLuP


@ceilingcat ok merci
RosLuP
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.