华师大 OJ 3037

题目链接: 点击打开链接


对于尽管不是非常复杂的情况,我们也应该把问题分割成一个一个小的步骤,这样不仅解决的时候不会感到脑子一片空白,或者有千丝万缕的关系,而且差错的时候也十分方便。

最近的几道题目都非常训练我对抽象数据类型的认识。抽象数据类型差不多就是数据结构,其实结构这个词本身就有集合元素加上集合上的一些算法。有了这样的一套东西以后,解决问题的时候就会感到十分的得心应手。

1. 定义两个大整数的抽象数据类型
2. 读入数据,用字符串读进来,然后转换一下存到大整数里面。
3. 进行加法并且将得到的和放在第一个参数里面。
4. 输出



解决方案:

//13:37-->14:15

/******************************************************************************/
/*                                                                            */
/*  DON'T MODIFY main() function anyway!                                      */
/*                                                                            */
/******************************************************************************/
#include <stdio.h>
#include <string.h>



void solve(); /* write function solve() to process one case of the problem    */
void init(){}
int main()
{  int i,t; init();
   scanf("%d\n",&t);
   for (i=0;i<t;i++)
   { printf("case #%d:\n",i);
     solve();
   }
   return 0;
}

//1. 定义两个大整数的抽象数据类型
//2. 读入数据,用字符串读进来,然后转换一下存到大整数里面。
//3. 进行加法并且将得到的和放在第一个参数里面。
//4. 输出



typedef struct {
    int cnt;
    int v[210];
} BIGINT;

void ADD_BIGINT(BIGINT *a, BIGINT *b){
    BIGINT tmp;
    BIGINT A,B;
    int k;
    int t;
    int cnt_a,cnt_b;
    int max,min;
    int carry;
    cnt_a = a->cnt;
    cnt_b = b->cnt;
    max = cnt_a > cnt_b ? cnt_a : cnt_b;
    min = cnt_a < cnt_b ? cnt_a : cnt_b;

    carry = 0;
    tmp.cnt = 0;

    //把a,b加起来放到tmp里面,然后把tmp赋值给*a;
    if(a->cnt < b->cnt){
        a->cnt = b->cnt;
        for(k=cnt_a;k<cnt_b;k++){
            a->v[k] = 0;
        }
    } else if(a->cnt > b->cnt){
        b->cnt = a->cnt;
        for(k=cnt_b;k<cnt_a;k++){
            b->v[k] = 0;
        }
    }
    cnt_a = a->cnt;
    cnt_b = b->cnt;
    for(k = 0; k < cnt_a;k++){
        t = a->v[k] + b->v[k] +carry;
        tmp.v[tmp.cnt++] = t % 16;
        carry = t / 16;
    }
    if(carry > 0){
        tmp.v[tmp.cnt++] = carry;
    }
    *a = tmp;


}

void solve(){
    char transformN2C[17] = "0123456789ABCDEF";  //transform from number to char
    char transformC2N[128];//transform char to number;
    BIGINT a,b;
    int k;
    char str_a[210],str_b[210];
    //初始化
    for(k=0;k<=9;k++){
        transformC2N['0'+k] = k;
    }
    for(k='A';k<='F';k++){
        transformC2N[k] = k - 'A' + 10;
    }
    a.cnt = 0;
    b.cnt = 0;

    scanf("%s %s",str_a,str_b);

    for(k=strlen(str_a)-1; k >= 0;k--){
        a.v[a.cnt++] = transformC2N[str_a[k]];
    }

    for(k=strlen(str_b)-1; k >= 0;k--){
        b.v[b.cnt++] = transformC2N[str_b[k]];
    }

    ADD_BIGINT(&a,&b);

    for(k=a.cnt-1;k>=0;k--){
        printf("%c",transformN2C[a.v[k]]);
    }
    printf("\n");
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值