天天看点

华师大 OJ 2876

题目描述:点击打开链接

这里要注意的是大整数进行除法的或者减法的时候,要记得判断当前大整数是不是大于0的。

因为我们这里定义的大整数只是自然数(N>=0)

解决方案:

// 14:25-->14:35
// 16:40-->16:58
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


void solve();

int main()
{
    int t;
    int k;
    scanf("%d\n",&t);
    for(k = 0; k < t; k++){
        solve();
    }
}


// 1.  定义大整数的抽象数据类型
// 2。 定义对大整数的除以2返回余数的方法。
// 3.  用字符串读入数据,保存到大整数里面去。
// 4.  对大整数除以2,得到余数,如果整数
//      已经被整除成了0,那么就用0作为它的返回值,知道另外一个整数也
//      被搞成0了。


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

int DIV2(BIGINT *b){
    int k;
    int carry;
    int t;
    carry = 0;
    if(b->v[b->cnt-1] < 2){
        carry = b->v[(b->cnt--)-1];
    }
    for(k = b->cnt-1; k >=0; k--){
        t =( (carry * 10) + b->v[k] );
        b->v[k] = t / 2;
        carry = t % 2;
    }
    return carry;
}




void solve(){
    static BIGINT a,b;
    static char str_a[1000001],str_b[1000001];
    int k;
    int count;
    int x,y;
    // Initialization
    a.cnt = 0;
    b.cnt = 0;
    count = 0;

    scanf("%s %s",str_a,str_b);
    for(k = strlen(str_a) - 1;k >= 0;k--){
        a.v[a.cnt++] = str_a[k] - '0';
    }

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

    while(!(a.cnt == 0 && b.cnt == 0)){
        if(a.cnt>0) x = DIV2(&a);
        else x = 0;
        if(b.cnt>0) y = DIV2(&b);
        else y = 0;
        if(x!=y) count++;
    }

    printf("%d\n",count);






}