View difference between Paste ID: aPNXDMF1 and MbEceDw2
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
*/