| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
略吭782ms低空飘过,开始写了个高精度类TLE了,祘法一點没改就去掉类就过了
还搞了一次PE,注意最后的结果行的宽度不一定是最大的!反例: 0*20
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
bool isDigit(char c){
return c>='0' && c<='9';
}
int mx(int a, int b){
return (a>b) ? a : b;
}
int mx(int a, int b, int c){
return mx(mx(a, b), c);
}
int ansM[505][505];
int ansWs[505];
int main() {
int t;
scanf("%d", &t);
char str[2333];
int ans[2333];
for(int ii = 0; ii < t; ii++){
int dd;
char opr;
scanf("%s", str);
int len = strlen(str);
for(int i = 0; i < len; i++){
if(!isDigit(str[i])){
dd = i;
opr = str[i];
break;
}
}
int len1 = dd, len2 = len-dd-1;
char *start1 = str+dd-1, *start2 = str+len-1;
switch(opr){
case '+':
{
int ws = mx(len1, len2);
int carry = 0;
for(int i = 0; i < ws; i++){
ans[i] = 0;
if(i<len1) ans[i] += (*(start1-i) - '0');
if(i<len2) ans[i] += (*(start2-i) - '0');
ans[i] += carry;
if(ans[i] > 9) {
ans[i] -= 10;
carry = 1;
}
else carry = 0;
}
if(carry){
ans[ws] = 1;
ws++;
}
int zws = mx(ws, len2+1);
for(int i = 0; i < zws-len1; i++) printf(" ");
for(int i = len1-1; i >= 0; i--) printf("%c", *(start1-i));
printf("\n");
for(int i = 0; i < zws-len2-1; i++) printf(" ");
printf("%c", opr);
for(int i = len2-1; i >= 0; i--) printf("%c", *(start2-i));
printf("\n");
for(int i = 0; i < zws; i++) printf("-");
printf("\n");
for(int i = 0; i < zws-ws; i++) printf(" ");
for(int i = ws-1; i >= 0; i--) printf("%d", ans[i]);
printf("\n\n");
break;
}
case '-':
{
int ws = mx(len1, len2);
int carry = 0;
for(int i = 0; i < ws; i++){
ans[i] = 0;
if(i<len1) ans[i] += (*(start1-i) - '0');
if(i<len2) ans[i] -= (*(start2-i) - '0');
ans[i] -= carry;
if(ans[i] < 0) {
ans[i] += 10;
carry = 1;
}
else carry = 0;
}
int I;
for(I = ws-1; I >= 0; I--){
if(ans[I]) break;
}
ws = I+1;
if(!ws) ws = 1;
int zws = mx(len1, ws, len2+1);
int xc = mx(len2+1, ws);
for(int i = 0; i < zws-len1; i++) printf(" ");
for(int i = len1-1; i >= 0; i--) printf("%c", *(start1-i));
printf("\n");
for(int i = 0; i < zws-len2-1; i++) printf(" ");
printf("%c", opr);
for(int i = len2-1; i >= 0; i--) printf("%c", *(start2-i));
printf("\n");
for(int i = 0; i < zws-xc; i++) printf(" ");
for(int i = 0; i < xc; i++) printf("-");
printf("\n");
for(int i = 0; i < zws-ws; i++) printf(" ");
for(int i = ws-1; i >= 0; i--) printf("%d", ans[i]);
printf("\n\n");
break;
}
case '*':
{
int ws = mx(len1, len2), zws;
if(len2==1){
int mult = *(start2)-'0';
if(mult == 0){
zws = mx(len1, 2);
for(int i = 0; i < zws-len1; i++) printf(" ");
for(int i = len1-1; i >= 0; i--) printf("%c", *(start1-i));
printf("\n");
for(int i = 0; i < zws-2; i++) printf(" ");
printf("%c", opr);
for(int i = len2-1; i >= 0; i--) printf("%c", *(start2-i));
printf("\n");
for(int i = 0; i < zws; i++) printf("-");
printf("\n");
for(int i = 0; i < zws-1; i++) printf(" ");
printf("0\n\n");
}
else{
int carry = 0;
for(int i = 0; i < len1; i++){
ans[i] = carry + mult * (*(start1-i)-'0');
carry = ans[i]/10;
ans[i]%=10;
}
if(carry){
ans[ws] = carry;
ws++;
}
zws = mx(ws, 2);
for(int i = 0; i < zws-len1; i++) printf(" ");
for(int i = len1-1; i >= 0; i--) printf("%c", *(start1-i));
printf("\n");
for(int i = 0; i < zws-2; i++) printf(" ");
printf("%c", opr);
for(int i = len2-1; i >= 0; i--) printf("%c", *(start2-i));
printf("\n");
for(int i = 0; i < zws; i++) printf("-");
printf("\n");
for(int i = 0; i < zws-ws; i++) printf(" ");
for(int i = ws-1; i >= 0; i--) printf("%d", ans[i]);
printf("\n\n");
}
}
else{
for(int i = 0; i < len2; i++){
int mult = *(start2-i)-'0';
if(!mult){
ansM[i][0] = 0;
ansWs[i] = 1;
}
else{
ansWs[i] = len1;
int carry = 0;
for(int j = 0; j < len1; j++){
ansM[i][j] = carry + mult * (*(start1-j)-'0');
carry = ansM[i][j]/10;
ansM[i][j]%=10;
}
if(carry){
ansM[i][ansWs[i]] = carry;
ansWs[i]++;
}
}
}
zws = len1+len2;
int carry = 0;
for(int i = 0; i < zws; i++){
ans[i] = carry;
for(int k = 0; k <= i && k < len2; k++){
if(i-k<ansWs[k]) ans[i] += ansM[k][i-k];
}
//cout << ans[i] << endl;
carry = ans[i]/10;
ans[i]%=10;
}
while(zws > 0 && !ans[zws-1]) zws--;
if(!zws) zws++;
int zwss = mx(zws, len1, len2+1);
//cout << zws << endl;
for(int i = 0; i < zwss-len1; i++) printf(" ");
for(int i = len1-1; i >= 0; i--) printf("%c", *(start1-i));
printf("\n");
for(int i = 0; i < zwss-len2-1; i++) printf(" ");
printf("%c", opr);
for(int i = len2-1; i >= 0; i--) printf("%c", *(start2-i));
printf("\n");
int xc = mx(ansWs[0], len2+1);
for(int i = 0; i < zwss-xc; i++) printf(" ");
for(int i = 0; i < xc; i++) printf("-");
printf("\n");
for(int i = 0; i < len2; i++){
for(int j = 0; j < zwss-i-ansWs[i]; j++) printf(" ");
for(int j = ansWs[i]-1; j >= 0; j--) printf("%d", ansM[i][j]);
printf("\n");
}
int xh = mx(zws, ansWs[len2-1] + len2-1);
for(int i = 0; i < zwss-xh; i++) printf(" ");
for(int i = 0; i < xh; i++) printf("-");
printf("\n");
for(int i = 0; i < zwss-zws; i++) printf(" ");
for(int i = zws-1; i >= 0; i--) printf("%d", ans[i]);
printf("\n\n");
}
break;
}
default:
break;
}
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator