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 **************************************/