2017-10-17 4 views
1

Ist es möglich, ein Programm wie dieses zu schreiben und nur den Integer-Typ und die Standardbibliothek <stdio.h> in C zu verwenden? Die Ausgabe des Rests muss als Dezimalzahl mit zwei Zahlen hinter dem Komma angezeigt werden.Ist es möglich, eine doppelte Zahl zu ersetzen und das Programm nur mit ganzen Zahlen in C zu schreiben, mit dem gleichen Ausgang?

#include <stdio.h> 

int num1 = 0; 
int num2 = 1; 
int num3 = 6; 
int num4 = 3; 
int num5 = 7; 
int num6 = 3; 
int num7 = 9; 
int num8 = 8; 

int sum, product, Result; 
double division; 

int main() 
{ 
    sum = num1 + num2 + num3 + num4; 
    product = num5 * num6 * num7; 
    Result = ((++product) - (sum++)) * sum; 

    int Integer_division = Result/(num8+ 1); 
    int Remainder = Result % (num8+ 1); 
    double division = Result/(num8+ 1); 

    printf("Result = %d\n", Result); 
    printf("Integer division = %d\n", Integer_division); 
    printf("Remainder = %d\n", Remainder); 
    printf("Division = %.02f\n", division); 

    return 0; 
} 

Ich dachte darüber in zwei Hälften aufgeteilt und mit einem Komma Druck zwischen (% d.% D) aber das klingt wie meine letztes Mittel ...

Vielen Dank im Voraus.

+0

Der Rest der Division nicht das gleiche wie die Fraktion nach dem Komma ist. – Barmar

+0

'.' ist ein Punkt oder Punkt, Komma ist', ' – Barmar

+0

Wenn Sie das Ergebnis in Bruchform formulieren:' printf ("% d% d /% d \ n", Integer_division, Rest, num8 +1) ' – ikegami

Antwort

1

Um Gleitkommazahlen wie Text aus ganzen Zahlen erfordert das Zeichen, während Nummer Teil und dem Bruchteil

char *sign = Result<0 ? "-":""; 
int whole = abs(Integer_division); 
char decimal_point = ','; // behind the comma. 
int hundredths = abs(Remainder *100/(num8+ 1)); // Convert fraction to 

1/100stel

// now print it 
printf("%s%d%c%02d", sign, whole, decimal_point, hundredths); 

Doch drucken diese zeigt nur ein abgeschnittenes Ergebnis Um Runde ist Arbeit.

Die übliche Art, Fließkommaausgabe unter Verwendung von ganzen Zahlen zu imitieren, um den Wert als einen Bruchteil von 2 ganzzahligen Teilen zu betrachten: numerator, denominator, der Skalierung benötigt (z. B. x100 für .00 Anzeige). Der Einfachheit halber angenommen denominator > 0.

Der erste Schritt ist die Rundung aufgrund der endlichen Anzeigegenauigkeit. Da der nächste Schritt eine ganzzahlige Teilung "Abschneiden gegen Null" beinhaltet und eine Gleitkomma-ähnliche Anzeige üblicherweise "Runde zum nächsten" ist, muss der Code eine vorzeichenbehaftete, unskalierte 0,5 oder eine Hälfte des Nenners hinzufügen.

Der Einfachheit halber wird angenommen, denominator > 0 und ist ungerade, so können wir Halbfälle vermeiden (noch mehr Arbeit). Nehmen Sie auch an, kein int Überlauf, um mehr Arbeit zu vermeiden.

int numerator = Result; 
int denominator = num8+ 1; 
int scale = 100; // to print to 0.xx 

int scaled_numerator = numerator * scale; 
int scaled_half = denominator/2; 
if (scaled_numerator < 0) scaled_half = -scaled_half; 
int rounded_scaled_numerator = scaled_numerator + scaled_half; 

Nun teilen

int scaled_value = rounded_scaled_numerator/denominator; 

char *sign = scaled_value<0 ? "-":""; 
scaled_value = abs(scaled_value); 
int whole = scaled_value/scale; 
char decimal_point = ','; 
int hundredths = scaled_value % scale; 
printf("%s%d%c%02d", sign, whole, decimal_point, hundredths); 
+0

Erstaunliche Lösung. Funktioniert wirklich gut, aber ich kann keine Zeichen verwenden – chumned

+0

Ich brauche keine vollständige Lösung für das Problem, nur die Antwort auf die Frage "Ist es möglich, es nur mit int und zu tun?" Aber gute Arbeit hier ... Danke. – chumned

+0

@chumned gibt es hier kein 'char' neben 'decimal_point'. Du könntest das fallen lassen und 'printf ("% s% d,% 02d ", Zeichen, ganz, Hundertstel) verwenden;'. Es gibt 'char *' hier: 'sign," - "," ","% s% d% c% 02d "'. Wenn Sie 'printf()' verwenden können, muss Ihre Antwort in der Lage sein, ein 'char *' zu verwenden. – chux

Verwandte Themen