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