Advertisement
Deerenaros

C-styleLong without subtraction, multiplication and division

Apr 27th, 2012
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.33 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <cstdlib>
  3.  
  4. void atoi(char *s);
  5. void itoa(char *i);
  6. void reverse(char *s);
  7. void swap(char *a, char *b);
  8. int minus(char *diff, char *red, char *sub);
  9. void plus(char *sum, char *a, char *b);
  10.  
  11. int repear(char *bad);
  12.  
  13. #define M_SIZE 512
  14.  
  15. int main(){
  16.     char a[M_SIZE], b[M_SIZE], c[M_SIZE];
  17.     int res;
  18.     gets(a), gets(b);
  19.     printf("putin - krabe\n");
  20.     atoi(a), atoi(b);
  21.     printf("why is putin eat children?\n");
  22.     res = minus(c, a, b);
  23.     printf("lol\n");
  24.     itoa(a); itoa(b); itoa(c);
  25.     if(res)
  26.         printf("%s - %s = %s\n", a, b, c);
  27.     else
  28.         printf("We are not work with negative numbers!\n");
  29.  
  30.     return 0;
  31. }
  32.  
  33. void atoi(char *s){
  34.     int i = 0;
  35.     reverse(s);
  36.     while(s[i]) s[i++] -= '0';
  37.     s[i] -= 1;
  38. }
  39.  
  40. void itoa(char *i){
  41.     int j = 0;
  42.     while(i[j] != -1) i[j++] += '0';
  43.     i[j] += 1;
  44.     reverse(i);
  45. }
  46.  
  47. void reverse(char *s){
  48.     int i = 0, j = 0;
  49.     while(s[++i]);
  50.     while(i > j) swap(s + (--i), s + j++);
  51. }
  52.  
  53. void swap(char *a, char *b){
  54.     char t = *a;
  55.     *a = *b;
  56.     *b = t;
  57. }
  58.  
  59.  
  60. void plus(char *sum, char *a, char *b){
  61.     int i = 0;
  62.     while(a[i] != -1 && b[i] != -1) sum[i++] = a[i] + b[i]; //сначала вычисляется выражение справа (a и b), потом sum, так что i++ стоит там где надо
  63.     if(a[i] == -1)
  64.         while(b[i] != -1) sum[i++] = b[i];
  65.     else
  66.         while(a[i] != -1) sum[i++] = a[i];
  67.     sum[i] = -1;
  68.     repear(sum);
  69. }
  70.  
  71. int minus(char *diff, char *red, char *sub){//difference, reduce, substra(ct/hend)
  72.     int i = 0;
  73.     while(red[i] != -1 && sub[i] != -1) diff[i++] = red[i] - sub[i]; //сначала вычисляется выражение справа (a и b), потом sum, так что i++ стоит там где надо
  74.     if(red[i] == -1)
  75.         while(red[i] != -1) diff[i++] = sub[i];
  76.     else
  77.         while(red[i] != -1) diff[i++] = red[i];
  78.     diff[i] = -1;
  79.     return repear(diff);
  80. }
  81.  
  82. int repear(char *bad){
  83.     int i = 0;
  84.     while(bad[i] != -1){
  85.         if(bad[i] < 0){
  86.             bad[i+1]--;
  87.             bad[i] += 10;
  88.            
  89.         }if(bad[i] / 10){ //нужно делать лишнюю проверку на наличие переполнение для сохранения "валидности" конца массива
  90.             if(bad[i+1] != -1) bad[i+1] += bad[i]/10;
  91.             else{
  92.                 bad[i+1] = bad[i]/10;
  93.                 bad[i+2] = -1;
  94.             }bad[i++] %= 10;
  95.         }
  96.     }
  97.    
  98.     return (bad[i-1] < 0) ? 0 : 1;
  99. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement