Hackerboard Wiki HaboBlog
Hackerboard bei Facebook Hackerboard bei Google+ Hackerboard bei Twitter

[HaBo]

 
Programmieraufgaben Hier wird regelmäßig eine neue Programmieraufgabe gestellt, die dann gelöst werden soll und in Zusammenarbeit mit den Moderatoren auch besprochen werden kann.

[leicht bis schwer]kontinuierliche Division

Diskussion: [leicht bis schwer]kontinuierliche Division im Forum Programmieraufgaben, in der Kategorie Code Kitchen; Anzeige Eingreicht von lone.wolf Zitat: Schwierigkeitsstufe: 2 (Mittel) Aufgabenstellung: Schreibe ein Programm, das die Nachkommastellen, die bei einer Division rauskommen, ...

Antwort
Alt 14.10.10, 23:00   #1 (permalink)
CDW
Moderator
 
Benutzerbild von CDW
 
Registriert seit: 20.07.05
CDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: Opteron
Likes: 202
Standard [leicht bis schwer]kontinuierliche Division

Anzeige

Eingreicht von lone.wolf

Zitat:
Schwierigkeitsstufe: 2 (Mittel)

Aufgabenstellung:
Schreibe ein Programm, das die Nachkommastellen, die bei einer Division rauskommen, ab der x'ten Stelle, y Stellen lang ermittelt.

Beispiel:
113 / 35 = 3,228571428571428571428 ...

Programm:
Eingabe> prog 113 35 2 4
Ausgabe< 2857
ich denke, die Aufgabenstellung ist ersichtlich.
Habe nur die Schwierigkeitsstufe etwas anders gemacht, da es hier auf die jeweils verwendete Sprache/Bibliothek ankommt (angefangen mit dem klassischen 3 Zeiler in Python bis hin zur eigenen Float-Bibliothek in C/Assembly )
oder anders gesagt:
leicht: setze die Aufgabe um
mittel: verwende dabei keine zusätzlichen Module (wer Maple & Co Verwendet, ist ein Cheater )
schwer: verwende keine zusätzlichen Module + die Nachkommastellenangaben sollen auch für große Werte möglich sein (wer Maple & Co verwendet, cheatet)
__________________
Noch mal, für alle Pseudo-Geeks: 1+1=0. -> 10 wäre Überlauf!
Selig, wer nichts zu sagen hat und trotzdem schweigt.
CDW ist offline   Mit Zitat antworten
Alt 14.10.10, 23:32   #2 (permalink)
 
Registriert seit: 12.01.09
lone.wolf Leistung: Z3
lone.wolf eine Nachricht über AIM schicken
Likes: 1
Standard

Hier mal meine Lösung
Lösung   


MfG und viel Spaß beim Nachgrübeln

Geändert von lone.wolf (15.10.10 um 00:01 Uhr)
lone.wolf ist offline   Mit Zitat antworten
   
HaBOT
 
- Anzeige -

Werbung ist gerade online    
Alt 17.10.10, 18:12   #3 (permalink)
 
Registriert seit: 09.12.09
Thunder11 Leistung: Z3
Likes: 0
Standard

Meine Lösung:
Lösung   
Code:
#include <stdio.h>
#include <stdlib.h>

int dividend,divisor;

int main(int argc, char **argv){
    int i,istart,imax;
    if(argc<5) return 0;
    dividend=atoi(argv[1]);
    divisor=atoi(argv[2]);
    if(divisor==0) return 0;
    istart=atoi(argv[3]);
    imax=istart+atoi(argv[4]);
    if(istart==0) printf("%d",dividend/divisor);
    for(i=1;i<imax;i++){
        dividend=dividend % divisor;
        if(dividend==0) break;
        dividend*=10;
        if(i>=istart && i<imax)
            printf("%d",dividend/divisor);
    }
    printf("\n");
    return 0;
}


Nicht wirklich weiterverwendbar; die Aufgabenstellung sollte aber korrekt gelöst sein. Ich hoffe es ist kein Fehler drinnen.

Ich wünsche auch noch viel Spaß beim Denken
mfg Thunder

PS: vorkompiliert im Anhang.
Angehängte Dateien
Dateityp: zip a.zip (6,2 KB, 1x aufgerufen)
__________________
B4 09 BA 08 01 CD 21 C3 48 61 6C 6C 6F 20 57 65 6C 74 21 24
Thunder11 ist offline   Mit Zitat antworten
Alt 17.10.10, 18:50   #4 (permalink)
 
Benutzerbild von b4ck
 
Registriert seit: 13.02.06
b4ck Leistung: Z3
Likes: 1
Standard

Bei meinen php-versionen wird davon ausgegangen dass das bcmath modul installiert/aktiviert ist.
bei normalen divisionen ohne bcmath wird leider nur bis zur 13ten nachkommastelle berechnet.
spoiler   

PHP-Code:
<?php

$a 
113;
$b 35;

$start 1;
$length 4;

$result explode('.',bcdiv($a,$b,50));

echo 
substr($result[1],$start,$length);

?>


und noch als oneliner:

oneliner   
PHP-Code:
    echo substr(substr(bcdiv($argv[1],$argv[2],50),strpos(bcdiv($argv[1],$argv[2],50),'.')+1),$argv[3],$argv[4]); 

Geändert von b4ck (18.10.10 um 15:55 Uhr)
b4ck ist offline   Mit Zitat antworten
Alt 17.10.10, 22:03   #5 (permalink)
 
Registriert seit: 12.10.10
Apfelkuchen Leistung: 8086
Likes: 19
Standard

Das würde auch Kommazahlen als Eingabe akzeptieren, funktioniert aber irgendwie nicht:
Delphi   

Könnte man, nimmt man die Anfangs- und Endtags weg, auch als Einzeiler schreiben, ich habs nur so aufgedröselt damit ich an den Fehler komme. Ich verdächtige ja den "pos(...,',')"-Part. Mit "." anstatt "," klappt's aber auch nicht. Das Problem: Er gibt nicht ab der c-ten Zahl nach dem Komma, sondern ab der c-ten Zahl vom Anfang an aus.
Code:
function habodivide(a,b:real;c,d:integer):integer;
begin
  result := strtoint(
                     copy(
                          floattostr(
                                     a/b
                                     ),
                          pos(
                              floattostr(
                                         a/b
                                         ),
                              ','
                              )+c,
                          d
                          )
                     );

end;


Das hier funktioniert, nimmt aber nur integer-Eingaben an:
Delphi   

Code:
function TForm1.habodivide(a,b,c,d:integer):integer;
begin
  result := strtoint(copy(floattostr(a/b),length(inttostr(a div b))+1+c,d));
end;

Geändert von Apfelkuchen (18.10.10 um 16:17 Uhr)
Apfelkuchen ist offline   Mit Zitat antworten
Alt 19.10.10, 12:51   #6 (permalink)
 
Registriert seit: 21.04.08
Ook! Leistung: Facit NTK
Likes: 0
Standard

Kleine, aber meiner Meinung nach, sehr schöne Lösung in Haskell.
Code:
import Data.List as L
import Data.Maybe as M

decimals :: Integer -> Integer -> String
decimals n d = let (n0,d0) = divMod n d
               in (show n0) ++ "," ++ (concatMap show $ next d0)
    where next nx | d > 0 = dx : next nx1
                  | otherwise = repeat 0
                  where (dx,nx1) = divMod (nx*10) d 

cut :: (Int,Int) -> String -> String
cut (s0,s1) xs = take s1 $ drop (idx+s0) xs
    where idx = M.fromJust $ L.elemIndex ',' xs

main :: IO ()
main = mapM_ print [cut (2,4) seq, take 25 seq]
    where seq = decimals 113 35
Zitat:
*Main> main
"2857"
"3,22857142857142857142857"
Gruß
Felix
Ook! ist offline   Mit Zitat antworten
Alt 10.11.10, 13:00   #7 (permalink)
 
Registriert seit: 10.11.10
DMRMcK Leistung: Z3
Likes: 0
Standard in VB

finds zwar selber net schön, weil der eingabestring immer wieder abgeschnitten wird, aber es funktioniert ^^

VB   
Code:
Module Module1
Sub Main()
Dim eingabe, erg AsString
Dim divid, divis AsDouble
Dim x, y AsInteger
 
eingabe = Console.ReadLine()
divid = CType(eingabe.Substring(0, eingabe.IndexOf(" ")), Double)
 
eingabe = eingabe.Substring(divid.ToString.Length + 1)
divis = CType(eingabe.Substring(0, eingabe.IndexOf(" ")), Double)
 
eingabe = eingabe.Substring(divis.ToString.Length + 1)
x = CType(eingabe.Substring(0, eingabe.IndexOf(" ")), Integer)
 
eingabe = eingabe.Substring(x.ToString.Length + 1)
y = CType(eingabe.Substring(0), Integer)
 
erg = (divid / divis).ToString
 
Console.WriteLine(erg)
Console.WriteLine(erg.Substring(erg.IndexOf(",") + x, y))
Console.ReadLine()
EndSub
EndModule

Geändert von DMRMcK (10.11.10 um 14:33 Uhr)
DMRMcK ist offline   Mit Zitat antworten
Alt 13.11.10, 21:30   #8 (permalink)
 
Registriert seit: 13.11.10
braindump Leistung: Facit NTK
Likes: 0
Standard

Nicht schön aber selten:
Java   

Code:
public class Division {
    public static void main(String args[]) {
        if (args.length != 4) {
            System.exit(1);
        }
        
        double dividend, divisor;
        int x, y, i, start, end, komma = 0;
        String ergebnis;
        
        dividend = Double.valueOf(args[0]);
        divisor = Double.valueOf(args[1]);
        x = Integer.parseInt(args[2]);
        y = Integer.parseInt(args[3]);
        
        ergebnis = String.valueOf(dividend / divisor);
       
        while (ergebnis.charAt(komma) != '.') {
            komma++;
        }
        
        for (i = komma + x; i < komma + x + y; i++) {
            System.out.print(ergebnis.charAt(i));
        }
        
        System.out.println();
    }
}
braindump ist offline   Mit Zitat antworten
Alt 19.05.11, 22:56   #9 (permalink)
 
Benutzerbild von Eydeet
 
Registriert seit: 14.04.06
Eydeet Leistung: Facit NTK
Likes: 4
Standard

Das läuft wahrscheinlich auch schon auf cheaten hinaus, da Python ja beliebig lange Zahlen erlaubt, aber so funktioniert es prinzipiell:
   
Code:
(n1, n2, x, y) = (113, 35, 2, 4)
print n1 * (10 ** (x + y - 1)) / n2 % (10**y)

Geändert von Eydeet (09.06.11 um 23:48 Uhr)
Eydeet ist offline   Mit Zitat antworten
Alt 22.05.12, 12:34   #10 (permalink)
 
Registriert seit: 22.05.12
MichaBe Leistung: Facit NTK
Likes: 0
Standard ...in php

Das Thema ist zwar schon bisschen älter, aber zum wieder bisschen reinkommen doch gut geeignet. Hier mein Code in php:
PHP-Code:
function getNachkomma($divident$divisor$offset$laenge) {
 
$rest $divident;
 
$ausgabe"";
 for(
$i 0$i <= $offset+$laenge$i++) {
  
$stelle 0;
  while(
$rest $divisor 0) {
   
$rest -= $divisor;
   
$stelle++;
  }
  
$rest *= 10;
  
  if(
$i >= $offset)
   
$ausgabe $ausgabe.$stelle;
 }
 return 
$ausgabe;

Hab hier leider grad keinen Server zum Testen, kann also sein, dass es noch Fehler hat, werd das aber, sobald ich zu Hause bin, mal testen
LG, Micha
MichaBe ist offline   Mit Zitat antworten
Antwort
   
- Anzeige -

Werbung ist gerade online    

[HaBo] » Software Home » Code Kitchen » Programmieraufgaben » [leicht bis schwer]kontinuierliche Division
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind aus
Pingbacks sind aus
Refbacks sind aus



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61