home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume17 / contest-prog / part02 / prob13.c < prev    next >
C/C++ Source or Header  |  1989-02-06  |  2KB  |  93 lines

  1. main(){
  2.     int oldop,mask,flag;
  3. #define newline '\n'
  4. #define null '\0'
  5.     /*
  6. From norris Fri Nov 11 11:06:03 1988
  7. Binary-binary
  8.  
  9.     Mathematicians refer to addition and subtraction as binary
  10. operations.  Since computer scientists like to take things much
  11. farther than they were intended, you are going to write a
  12. binary binary calculator.
  13.     This calculator program will accept infix expressions involving
  14. only + and - and unsigned binary integers.  No parentheses or
  15. other operations will be present.  You must compute the value
  16. of the expression and display the result in binary.  Negative
  17. results should be printed with a leading minus sign.
  18.     Data considerations:
  19.       Input will consist of an unspecified number of expressions,
  20.    one per line; end-of-file will indicate the end of data. Each
  21.    expression will contain no leading or embedded blanks.  No
  22.    expression will contain more than 80 characters.  The
  23.    expression values are to be computed left-to-right.  No
  24.    number or intermediate value will require more than 15 bits
  25.    of precision.  Output should start in column 1 of the 
  26.    output file, one result per line, with no leading zeroes.
  27.  
  28. Example:
  29.    the input expression:   110+11-1+100
  30.    results in the output
  31. 1100
  32.  
  33.    the input expression:   1100-11000+111-10
  34.    results in the output
  35. -111
  36. */
  37.     char line[90];
  38.     int sum,n;
  39.     char *p;
  40.     char *gets();
  41.     while(  gets(line)==line  ){
  42.         p=line;
  43.         n=0;
  44.         for(p=line,n=0,sum=0,oldop='+';;p++) {
  45.             switch(*p){
  46.             case '-':
  47.             case '+':
  48.                 if(oldop=='+')sum += n; 
  49.                 else sum -=n; 
  50.                 n=0; 
  51.                 oldop= *p;
  52.                 break;
  53.             case '0': 
  54.                 n= n* 2; 
  55.                 break;
  56.             case '1': 
  57.                 n= n*2+1; 
  58.                 break;
  59.             case newline:
  60.             case 0:
  61.                 if(oldop=='+')sum += n; 
  62.                 else sum -=n; 
  63.                 goto out;
  64. /*                n=0; */
  65. /*                oldop= *p;*/
  66.                 break;
  67.             default: 
  68.                 ;
  69.             }
  70.         }
  71. out: /*printf("%d\n",sum);*/
  72.         ;
  73.         if(sum==0){
  74.             putchar('0');
  75.             putchar(newline);
  76.             continue;
  77.         }
  78.         if(sum<0){
  79.             putchar('-'); 
  80.             sum = - sum;
  81.         }
  82.         for(mask=0100000, flag=0; mask; mask >>=1){
  83.  
  84.             if(sum & mask ){
  85.                 putchar('1');
  86.                 flag=1;
  87.             } else if(flag)putchar('0');
  88.         }
  89.         putchar(newline);
  90.  
  91.     }/*endwhile gets*/
  92. }/*end main*/
  93.