SHOW:
|
|
- or go back to the newest paste.
1 | // div.cpp : Defines the entry point for the console application. | |
2 | // | |
3 | #include <stdio.h> | |
4 | ||
5 | int div_(int n, int d); | |
6 | void binary_out(int b,char *s); | |
7 | ||
8 | ||
9 | int main(void) | |
10 | { | |
11 | - | int n,d,r; |
11 | + | int n,d,r; |
12 | - | for(;;) |
12 | + | for(;;) |
13 | - | { |
13 | + | { |
14 | - | printf("Enter numerator and denominator (-1 to quit):"); |
14 | + | printf("Enter numerator and denominator (-1 to quit):"); |
15 | - | scanf("%d %d",&n,&d); |
15 | + | scanf("%d %d",&n,&d); |
16 | - | if((n==-1)||(d==-1)) |
16 | + | if((n==-1)||(d==-1)) |
17 | - | break; |
17 | + | break; |
18 | - | binary_out(n,"<- numerator\n"); |
18 | + | binary_out(n,"<- numerator\n"); |
19 | - | binary_out(d,"<- denominator\n"); |
19 | + | binary_out(d,"<- denominator\n"); |
20 | - | r=div_(n,d); |
20 | + | r=div_(n,d); |
21 | - | printf("===\n"); |
21 | + | printf("===\n"); |
22 | - | binary_out(r,"<- quotient\n"); |
22 | + | binary_out(r,"<- quotient\n"); |
23 | - | } |
23 | + | } |
24 | - | return 0; |
24 | + | return 0; |
25 | } | |
26 | ||
27 | void binary_out(int b,char *s) | |
28 | - | { |
28 | + | { |
29 | - | int x; |
29 | + | int x; |
30 | - | for(x=(sizeof(b)<<3)-1;x>=0;x--) |
30 | + | for(x=(sizeof(b)<<3)-1;x>=0;x--) |
31 | - | if(b&(1<<x)) |
31 | + | if(b&(1<<x)) |
32 | - | printf("1"); |
32 | + | printf("1"); |
33 | - | else |
33 | + | else |
34 | - | printf("0"); |
34 | + | printf("0"); |
35 | - | printf("(%d) %s",b,s); |
35 | + | printf("(%d) %s",b,s); |
36 | - | } |
36 | + | } |
37 | ||
38 | #define DEBUG_DIV | |
39 | ||
40 | int div_(int n, int d) | |
41 | - | { |
41 | + | { |
42 | - | int res,x,t; |
42 | + | int res,x,t; |
43 | - | res=0; /* зануляем все разряды */ |
43 | + | res=0; /* зануляем все разряды */ |
44 | - | for(x=(sizeof(n)<<3)-1;x>=0;x--)/* пройти по всем битам от старшего до младшего */ |
44 | + | for(x=(sizeof(n)<<3)-1;x>=0;x--)/* пройти по всем битам от старшего до младшего */ |
45 | - | { |
45 | + | { |
46 | - | t=n>>x;/* сдвигаем, чтобы остались только старшие (sizeof(n)-x) бит */ |
46 | + | t=n>>x;/* сдвигаем, чтобы остались только старшие (sizeof(n)-x) бит */ |
47 | #ifdef DEBUG_DIV | |
48 | - | printf("************************************************\n"); |
48 | + | printf("************************************************\n"); |
49 | - | binary_out(x," <- x\n"); |
49 | + | binary_out(x," <- x\n"); |
50 | - | binary_out(t," <- t\n\n"); |
50 | + | binary_out(t," <- t\n\n"); |
51 | #endif | |
52 | - | if(t>=d)/* если старшие биты больше делителя */ |
52 | + | if(t>=d)/* если старшие биты больше делителя */ |
53 | - | { |
53 | + | { |
54 | #ifdef DEBUG_DIV | |
55 | - | binary_out(n,"_<- n before\n"); |
55 | + | binary_out(n,"_<- n before\n"); |
56 | - | binary_out(d<<x," <- subtrahend\n"); |
56 | + | binary_out(d<<x," <- subtrahend\n"); |
57 | #endif | |
58 | - | n=n-(d<<x); /* то вычитаем из исходного числа делитель, сдвинутый |
58 | + | n=n-(d<<x); /* то вычитаем из исходного числа делитель, сдвинутый |
59 | - | так, чтобы он был под старшими разрядами */ |
59 | + | так, чтобы он был под старшими разрядами */ |
60 | #ifdef DEBUG_DIV | |
61 | - | printf("--------------------------------\n"); |
61 | + | printf("--------------------------------\n"); |
62 | - | binary_out(n,"<- difference\n\n"); |
62 | + | binary_out(n,"<- difference\n\n"); |
63 | - | binary_out(res," <- old res\n"); |
63 | + | binary_out(res," <- old res\n"); |
64 | - | binary_out(1<<x,"+ <- adding\n"); |
64 | + | binary_out(1<<x,"+ <- adding\n"); |
65 | - | printf("--------------------------------\n"); |
65 | + | printf("--------------------------------\n"); |
66 | #endif | |
67 | - | res=res+(1<<x); /* а в результат добавляем единичку в соотетствующем разряде */ |
67 | + | res=res+(1<<x); /* а в результат добавляем единичку в соотетствующем разряде */ |
68 | #ifdef DEBUG_DIV | |
69 | - | binary_out(res,"<- new res\n"); |
69 | + | binary_out(res,"<- new res\n"); |
70 | #endif | |
71 | - | } |
71 | + | } |
72 | - | /* ну а если условие не выполняется, то ничего не делаем |
72 | + | /* ну а если условие не выполняется, то ничего не делаем |
73 | - | потому что вычитать нечего, а надо записать в очередной разряд |
73 | + | потому что вычитать нечего, а надо записать в очередной разряд |
74 | - | нолик... но он уже там!*/ |
74 | + | нолик... но он уже там!*/ |
75 | - | } |
75 | + | } |
76 | - | return res; |
76 | + | return res; |
77 | - | } |
77 | + | } |
78 | ||
79 | /* clear division -- without debug or comments | |
80 | int div_(int n, int d) | |
81 | - | { |
81 | + | { |
82 | - | int res,x,t; |
82 | + | int res,x,t; |
83 | - | res=0; |
83 | + | res=0; |
84 | - | for(x=(sizeof(n)<<3)-1;x>=0;x--) |
84 | + | for(x=(sizeof(n)<<3)-1;x>=0;x--) |
85 | - | { |
85 | + | { |
86 | - | t=n>>x; |
86 | + | t=n>>x; |
87 | - | if(t>=d) |
87 | + | if(t>=d) |
88 | - | { |
88 | + | { |
89 | - | n=n-(d<<x); |
89 | + | n=n-(d<<x); |
90 | - | res=res+(1<<x); |
90 | + | res=res+(1<<x); |
91 | - | } |
91 | + | } |
92 | - | } |
92 | + | } |
93 | - | return res; |
93 | + | return res; |
94 | - | } |
94 | + | } |
95 | */ |