BIT寒假练习-2013__1000:a+b

这是一道很简单的高精度题目,唯一的难点在于异号时的运算。

根据小学减法竖式的计算方法很容易就能算出来了,这道题一共可以分为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;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值