题目链接: 点击打开链接
对于尽管不是非常复杂的情况,我们也应该把问题分割成一个一个小的步骤,这样不仅解决的时候不会感到脑子一片空白,或者有千丝万缕的关系,而且差错的时候也十分方便。
最近的几道题目都非常训练我对抽象数据类型的认识。抽象数据类型差不多就是数据结构,其实结构这个词本身就有集合元素加上集合上的一些算法。有了这样的一套东西以后,解决问题的时候就会感到十分的得心应手。
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");
}