Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- Author: 曹北健
- Result: AC Submission_id: 3497886
- Created at: Thu May 20 2021 16:54:14 GMT+0800 (China Standard Time)
- Problem_id: 3268 Time: 277 Memory: 1724
- */
- #include <stdio.h>
- #include <stdlib.h>
- #include <ctype.h>
- #include <math.h>
- #include <string.h>
- #pragma warning(disable:4996)
- #define N 10
- typedef long long LL;
- typedef struct cbj0{
- short num[10020];
- char sgn;
- int len;
- }bignum;
- bignum A, B, *T;
- char buf1[10020], buf2[10020];
- int compabs(bignum *, bignum *);
- bignum *add0(bignum *, bignum *);
- bignum *subtract0(bignum *, bignum *);
- bignum *add(bignum *, bignum *);
- bignum *subtract(bignum *, bignum *);
- void reverse(short *a, int n){
- int i, tmp;
- for(i = 0; i < n / 2; i++){
- tmp = a[i];
- a[i] = a[n - 1 - i];
- a[n - 1 - i] = tmp;
- }
- }
- void input(char *buf, bignum *a){
- int loc = 0;
- if(buf[0] == '-'){ a->sgn = '-'; loc++; }
- else a->sgn = '+';
- int cnt = 0, i;
- while(buf[loc] != '\0'){
- a->num[cnt] = buf[loc] - '0';
- loc++; cnt++;
- }
- for(i = cnt; i < 10020; i++)a->num[i] = 0;
- a->len = cnt;
- reverse(a->num, cnt);
- }
- int iszero(bignum *p){
- int i;
- for(i = p->len; i >= 0; i--){
- if(p->num[i] != 0)return 0;
- }
- return 1;
- }
- bignum *add(bignum *a, bignum *b){
- bignum *tmp;
- if(a->sgn == b->sgn){
- tmp = add0(a, b);
- }
- else{//异号
- if(compabs(a, b) >= 0){
- tmp = subtract0(a, b);
- }
- else{
- tmp = subtract0(b, a);
- }
- }
- return tmp;
- }
- int compabs(bignum *a, bignum *b){
- if(a->len > b->len)return 1;
- else{
- if(a->len < b->len)return -1;
- else{
- int i = a->len - 1;
- while(i >= 0){
- if(a->num[i] > b->num[i])return 1;
- if(a->num[i] < b->num[i])return -1;
- i--;
- }
- return 0;
- }
- }
- }
- bignum *add0(bignum *a, bignum *b){//ab同号
- int i = 0;
- while(i < a->len || i < b->len){
- short sum = 0;
- sum = (a->num[i]) + (b->num[i]);
- if(sum >= N){//进位
- a->num[i] = sum % N;
- a->num[i + 1] += sum / N;
- }
- else{
- a->num[i] = sum;
- }
- i++;
- }
- if(a->num[i] != 0){
- i++;
- }
- a->len = i;
- return a;
- }
- bignum *subtract0(bignum *a, bignum *b){//a>=b>=0
- int i = 0, cnt = 0;
- while(i < a->len){
- short tmp = a->num[i] - b->num[i];
- if(tmp < 0){
- a->num[i + 1] -= 1;
- a->num[i] = tmp + N;
- }
- else{
- a->num[i] = tmp;
- }
- cnt++; i++;
- }
- for(i = cnt - 1; i >= 0; i--){
- if(a->num[i] == 0){
- cnt--;
- }
- else{
- break;
- }
- }
- if(cnt == 0)cnt++;
- a->len = cnt;
- return a;
- }
- int main(){
- #ifdef _DEBUG
- freopen("../../../in.txt", "r", stdin);
- #endif
- int i;//sgn为1表示正数 -1表示负数
- while(~scanf("%s%s", buf1, buf2)){
- memset(&A, 0, sizeof(bignum));
- memset(&B, 0, sizeof(bignum));
- input(buf1, &A);
- input(buf2, &B);
- T = add(&A, &B);
- if(iszero(T)){
- printf("0\n");
- }
- else{
- if(T->sgn == '-'){ putchar('-'); }
- for(i = T->len - 1; i >= 0; i--){
- printf("%d", T->num[i]);
- }
- putchar('\n');
- }
- }
- #ifdef _DEBUG
- freopen("CON", "r", stdin);
- system("pause");
- #endif
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement