题目描述:点击打开链接
这里要注意的是大整数进行除法的或者减法的时候,要记得判断当前大整数是不是大于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);
}