sdut1642Simple Arithmetics(模拟)

链接

发个长长的模拟 这题要注意的地方挺多 -的个数 以及对齐的情况 全都注意好了 大数的加减乘就可以了

  1 #include <iostream>
  2 #include<cstdio>
  3 #include<cstring>
  4 #include<algorithm>
  5 #include<stdlib.h>
  6 #include<vector>
  7 #include<cmath>
  8 #include<queue>
  9 using namespace std;
 10 #define N 510
 11 char s1[N],s2[N];
 12 int s[N][N*2],o[N];
 13 int main()
 14 {
 15     int t,i,j,k1,k2,len;
 16     char c,tc;
 17     scanf("%d",&t);
 18     getchar();
 19     while(t--)
 20     {
 21         len = 0;k1=0;
 22         for(;;)
 23         {
 24            scanf("%c",&c);
 25            if(c=='+'||c=='-'||c=='*')
 26            {
 27                tc = c;
 28                s1[k1] = '\0';
 29                break;
 30            }
 31            s1[k1++] = c;
 32         }
 33         gets(s2);
 34         k2 = strlen(s2);
 35         for(i = 0 ; i <= k2; i++)
 36             for(j = 0 ; j <= k2+k1+10 ; j++)
 37             s[i][j] = 0;
 38         for(i = 0 ; i <= k2 ; i++)
 39         o[i] = 0;
 40         if(tc=='+')
 41         {
 42             i = k1-1,j=k2-1;
 43             int g = 0;
 44             while(i>=0&&j>=0)
 45             {
 46                 int ko = s[1][g]+s1[i--]-'0'+s2[j--]-'0';
 47                 s[1][g+1] = ko/10;
 48                 s[1][g++] = ko%10;
 49             }
 50             while(i>=0)
 51             {
 52                 int ko = s[1][g]+s1[i--]-'0';
 53                 s[1][g+1] = ko/10;
 54                 s[1][g++] = ko%10;
 55             }
 56             while(j>=0)
 57             {
 58                 int ko = s[1][g]+s2[j--]-'0';
 59                 s[1][g+1] = ko/10;
 60                 s[1][g++] = ko%10;
 61             }
 62             g++;
 63             while(s[1][g]==0&&g>0) g--;
 64             int dd = max(g+1,max(k1,k2+1));
 65             for(i = 1; i <= dd-k1 ; i++) printf(" ");
 66             printf("%s\n",s1);
 67             for(i = 1; i <= dd-1-k2 ; i++) printf(" ");
 68             printf("%c%s\n",tc,s2);
 69             for(i = 1; i <= dd-max(k2+1,g+1) ; i++) printf(" ");
 70             for(i = 1; i <= max(k2+1,g+1) ; i++)
 71             printf("-");
 72             puts("");
 73             for(i = 1; i <= dd-1-g ; i++) printf(" ");
 74             for(i = g ; i >= 0 ; i--)
 75             printf("%d",s[1][i]);
 76             puts("");
 77         }
 78         else if(tc=='-')
 79         {
 80             i = k1-1,j=k2-1;
 81             int g = 0;
 82             while(i>=0&&j>=0)
 83             {
 84                 int ko = s[1][g]+s1[i]-s2[j];
 85                 if(ko<0)
 86                 {
 87                     ko+=10;s[1][g+1]--;
 88                 }
 89                 s[1][g++] = ko;i--;j--;
 90             }
 91             while(i>=0)
 92             {
 93                 int ko = s[1][g]+s1[i]-'0';
 94                 if(ko<0)
 95                 {
 96                     ko+=10;s[1][g+1]--;
 97                 }
 98                 s[1][g++] = ko;i--;
 99             }
100             while(s[1][g]==0&&g>0) g--;
101             int dd = max(k1,k2+1);
102             for(i = 1; i <= dd-k1 ; i++) printf(" ");
103             printf("%s\n",s1);
104             for(i = 1; i <= dd-1-k2 ; i++) printf(" ");
105             printf("%c%s\n",tc,s2);
106             for(i = 1; i <= dd-max(k2+1,g+1) ; i++) printf(" ");
107             for(i = 1; i <= max(k2+1,g+1) ; i++) printf("-");
108             puts("");
109             for(i = 1; i <= dd-1-g ; i++) printf(" ");
110             for(i = g ; i >= 0 ; i--)
111             printf("%d",s[1][i]);
112             puts("");
113         }
114         else
115         {
116             for(i = k2-1 ; i >= 0 ; i--)
117             {
118                 o[i] = k2-1-i;
119                 for(j = k1-1 ; j >= 0 ; j--)
120                 {
121                     int ko = s[i][o[i]]+(s2[i]-'0')*(s1[j]-'0');
122                     s[i][o[i]+1] = ko/10;
123                     s[i][o[i]++] = ko%10;
124                 }
125                 while(s[i][o[i]]==0&&o[i]>(k2-1-i)) o[i]--;
126                 for(j = 0 ; j <= max(o[k2],o[i]) ; j++)
127                 {
128                     int ko = s[k2][j]+s[i][j];
129                     s[k2][j] = ko%10;
130                     s[k2][j+1] += ko/10;
131                 }
132                 o[k2] = max(o[k2],o[i]);
133                 if(s[k2][o[k2]+1]) o[k2]++;
134             }
135             while(s[k2][o[k2]]==0&&o[k2]>0) o[k2]--;
136             int dd = max(max(k1,k2+1),o[k2]+1);
137             int td = max(k2+1,o[k2-1]+1);
138             for(i = 1; i <= dd-k1 ; i++) printf(" ");
139             printf("%s\n",s1);
140             for(i = 1; i <= dd-k2-1 ; i++) printf(" ");
141             printf("%c%s\n",tc,s2);
142             for(i = 1; i <= dd-td ; i++) printf(" ");
143             for(i = 1; i <= td ; i++)
144             printf("-");puts("");
145             for(i = k2-1 ; i >= 0 ; i--)
146             {
147                 for(j = 1; j < dd-o[i] ; j++) printf(" ");
148                 for(j = o[i] ; j >= k2-i-1 ; j--) printf("%d",s[i][j]);
149                 puts("");
150             }
151             if(k2>1)
152             {
153                 for(i = 1; i < dd-o[k2] ; i++) printf(" ");
154                 for(i = 1; i <= o[k2]+1 ; i++)
155                 printf("-");puts("");
156                 for(i = 1; i < dd-o[k2] ; i++) printf(" ");
157                 for(i = o[k2] ; i >= 0 ; i--)
158                 printf("%d",s[k2][i]);
159                 puts("");
160             }
161         }
162         puts("");
163     }
164     return 0;
165 }
166  
167 
168 
169 
170 /**************************************
171     Problem id    : SDUT OJ 1642 
172     User name    : shang 
173     Result        : Accepted 
174     Take Memory    : 912K 
175     Take Time    : 160MS 
176     Submit Time    : 2014-02-15 20:53:30  
177 **************************************/
View Code

 

转载于:https://www.cnblogs.com/shangyu/p/3550839.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值