华师大 OJ 3037

来源:互联网 发布:局域网分析软件 编辑:程序博客网 时间:2024/05/01 04:42

题目链接: 点击打开链接


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

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

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
原创粉丝点击