这是一道很简单的高精度题目,唯一的难点在于异号时的运算。
根据小学减法竖式的计算方法很容易就能算出来了,这道题一共可以分为2种情况讨论:一种是同号,这很简单,相加,然后加上符号;还有一种情况是异号,异号的情况,首先比较两个数,哪个大,结果的符号就是谁的,然后就是大数减小数。
这道题纠结了一下,以前遇到过多组数据的情况,自己写了一个觉得好像是正确的while循环,结果一直TLE,还以为是算法问题,搞了半天,最后文件调试才发现程序一直不结束。-。-
#include <stdio.h>
#include <stdlib.h>
#include <string>
int ans[5][2000];
char s[2000];
int k,p,n;
void change(int k,int h,int t)
{
p = ans[k][h];
ans[k][h] = ans[k][t];
ans[k][t] = p;
return;
}
int max(int a,int b)
{
if (a>b) return a;
else return b;
}
void doit1()
{
n = strlen(s);
for (int i = 1 ; i <= k ; i ++)
ans[1][i] = s[i - 1] - 48;
ans[1][0] = k;
for (int i = k+1 ; i < n ; i++)
ans[2][i-k] = s[i] - 48;
ans[2][0] = n - k - 1;
for (int i = 1 ; i <= ans[1][0] ; i++)
{
if (i > ans[1][0] - i + 1) break;
change(1,i,ans[1][0] - i + 1);
}
for (int i = 1 ; i <= ans[2][0] ; i ++)
{
if (i > ans[2][0] - i + 1) break;
change(2,i,ans[2][0] - i + 1);
}
int x=0;
ans[3][0] = max(ans[1][0],ans[2][0]);
for (int i = 1 ; i <= ans[3][0] ; i ++)
{
ans[3][i] = ans[1][i] + ans[2][i] + x;
x = ans[3][i] / 10;
ans[3][i] = ans[3][i] % 10;
}
if (x != 0) {
ans[3][0]++;
ans[3][ans[3][0]] = x;
}
for (int i = ans[3][0] ; i > 0 ; i --)
printf("%d",ans[3][i]);
printf("\n");
return;
}
void doit2()
{
n = strlen(s);
for (int i = 1 ; i <= k ; i ++)
ans[1][i] = s[i - 1] - 48;
ans[1][0] = k;
for (int i = k+1 ; i < n ; i++)
ans[2][i-k] = s[i] - 48;
ans[2][0] = n - k - 1;
ans[1][1] = 0;
ans[2][1] = 0;
for (int i = 1 ; i <= ans[1][0] ; i++)
{
if (i > ans[1][0] - i + 1) break;
change(1,i,ans[1][0] - i + 1);
}
for (int i = 1 ; i <= ans[2][0] ; i ++)
{
if (i > ans[2][0] - i + 1) break;
change(2,i,ans[2][0] - i + 1);
}
ans[1][0]--;
ans[2][0]--;
int x=0;
ans[3][0] = max(ans[1][0],ans[2][0]);
for (int i = 1 ; i <= ans[3][0] ; i ++)
{
ans[3][i] = ans[1][i] + ans[2][i] + x;
x = ans[3][i] / 10;
ans[3][i] = ans[3][i] % 10;
}
if (x != 0) {
ans[3][0]++;
ans[3][ans[3][0]] = x;
}
printf("-");
for (int i = ans[3][0] ; i > 0 ; i --)
printf("%d",ans[3][i]);
printf("\n");
return;
}
void work(int f,int big,int sma)
{
int x=0;
ans[3][0] = max(ans[big][0],ans[sma][0]);
for (int i = 1 ; i <= ans[3][0] ; i ++)
{
ans[3][i] = ans[big][i] - ans[sma][i] + x;
x=0;
if (ans[3][i] < 0) {
ans[3][i] += 10;
x=-1;
}
}
while (ans[3][ans[3][0]] == 0) ans[3][0]--;
if (f == 1) printf("-");
for (int i = ans[3][0] ; i > 0 ; i --)
printf("%d",ans[3][i]);
printf("\n");
return;
}
void doit3()
{
int pd1=0,pd2=0;
n = strlen(s);
for (int i = 1 ; i <= k ; i ++)
ans[1][i] = s[i - 1] - 48;
ans[1][0] = k;
for (int i = k+1 ; i < n ; i++)
ans[2][i-k] = s[i] - 48;
ans[2][0] = n - k - 1;
for (int i = 1 ; i <= ans[1][0] ; i++)
{
if (i > ans[1][0] - i + 1) break;
change(1,i,ans[1][0] - i + 1);
}
for (int i = 1 ; i <= ans[2][0] ; i ++)
{
if (i > ans[2][0] - i + 1) break;
change(2,i,ans[2][0] - i + 1);
}
if (s[0] == '-') {
pd1 = 1;
ans[1][ans[1][0]] = 0;
ans[1][0]--;
}
if (s[k+1] == '-') {
pd2 = 1;
ans[2][ans[2][0]] = 0;
ans[2][0] --;
}
if (ans[1][0] > ans[2][0]) work(pd1,1,2);
if (ans[1][0] < ans[2][0]) work(pd2,2,1);
if (ans[1][0] == ans[2][0]) {
int j = 1;
while (ans[1][j] == ans[2][j]) j++;
if (j > ans[1][0]) {
printf("0\n");
return;
}
if (ans[1][j] > ans[2][j]) work(pd1,1,2);
else work(pd2,2,1);
}
return;
}
int main()
{
while (gets(s) != NULL)
{
memset(ans,0,sizeof(ans));
k = 0;
while (s[k] != ' ') k++;
if (s[0] != '-') {
if (s[k+1] != '-') doit1();
else doit3();
}
else {
if (s[k+1] == '-') doit2();
else doit3();
}
}
return 0;
}