void bigmul (int *s, int *t) { int i; memset (sum, 0, sizeof(int)*MAXN); for (i=0; i<MAXN; i++) { bitmul (s, t[i], i); bigadd (sum, bitp); } }
/* fibo: calculate fibonacci number from 0 to 5000 */ void fibo(void) { int i, digit; number[0][0] = 0; number[1][0] = digit = 1; for (i = 2; i < MAXN; i++) digit = bigadd(i, i - 1, i - 2, digit); }
// Multiplicates n words in s by f, adds s2, stores result to d, returns overflow word rawtype basemuladd (rawtype *dest, rawtype *src1, rawtype *src2, rawtype src3, size_t len, rawtype carry) { size_t t; rawtype tmp[2], tmpcarry[2]; tmpcarry[0] = carry; tmpcarry[1] = 0; for (t = len; t--;) { tmp[1] = bigmul (tmp, src1 + t, src3, 1); bigadd (tmp, tmpcarry, 1, 1); if (src2) bigadd (tmp, src2 + t, 1, 1); dest[t] = bigdiv (tmpcarry, tmp, Base, 2); } return tmpcarry[0]; }
bignum *bigincrement(bignum *n,size_t by_n) { ABORT_NABN(n); while(by_n--) bigadd(n,&BIGONE,n); ABORT_NABN(n); return n; }
/* fibo: calculate fibonacci number from 0 to 5000 */ void fibo(int **n) { int i, digit; n[0][0] = 0; n[1][0] = digit = 1; for (i = 2; i < MAXN; i++) digit = bigadd(n[i], n[i - 1], n[i - 2], digit); }
int main() { int n,len; while(scanf("%s%s%s",s1,s2)!=EOF) { change(s1); change(s2);//翻转运算数 bigadd(s1,s2,ans); } return 0; }
void adddigits(bignum ret, bignum num) { int i; bignum temp; for(i = 0; i < num->pos; i++) { bigset(temp, num->num[i], 10); bigadd(ret, ret, temp); } }
// Adds n words from s to d, returns overflow carry bit rawtype baseadd (rawtype *dest, rawtype *src1, rawtype *src2, size_t len, rawtype carry) { size_t t; for (t = len; t--;) { dest[t] = src1[t]; bigadd (dest + t, &carry, 1); if ((src2 && bigadd (dest + t, src2 + t, 1) != 0) || bigcmp (dest + t, &Base, 1) >= 0) { bigsub (dest + t, &Base, 1); carry = 1; } else { carry = 0; } } return carry; }
// Subtracts n words s from d, returns subtract carry bit (1) rawtype basesub (rawtype *dest, rawtype *src1, rawtype *src2, size_t len, rawtype carry) { size_t t; rawtype tmp; for (t = len; t--;) { dest[t] = (src1 ? src1[t] : 0); tmp = (src2 ? src2[t] : 0); bigadd (&tmp, &carry, 1); if (bigsub (dest + t, &tmp, 1) != 0) { bigadd (dest + t, &Base, 1); carry = 1; } else { carry = 0; } } return carry; }
void bigmult( int * a,int * b,int * r) { if(b[0]==1) { b[0]=0; bigmult( a,b,r); bigadd( a,r); } else { if(iszero(b)) { for(int i=0;i<10000;i++) r[i]=0; } else { dropdown(b); bigmult(a,b,r); bigadd(r,r); } } }
// Divides n words in s by f, stores result in d, returns remainder rawtype basediv (rawtype *dest, rawtype *src1, rawtype src2, size_t len, rawtype carry) { size_t t; rawtype tmp[2]; for (t = 0; t < len; t++) { tmp[1] = bigmul (tmp, &carry, Base, 1); if (src1) bigadd (tmp, src1 + t, 1, 1); carry = bigdiv (tmp, tmp, src2, 2); dest[t] = tmp[0]; } return carry; }
// Returns in r the solution of x == r[k] (mod m[k]), k = 0, ..., n-1 void crt (rawtype *r, rawtype *m, size_t n) { size_t t, k; rawtype *mm = new rawtype[n], *x = new rawtype[n], *s = new rawtype[n]; modint y; rawtype o; o = modint::modulus; mm[0] = m[0]; for (t = 1; t < n; t++) mm[t] = bigmul (mm, mm, m[t], t); for (t = 0; t < n; t++) s[t] = 0; for (k = 0; k < n; k++) { setmodulus (m[k]); y = 1; for (t = 0; t < n; t++) if (t != k) y *= m[t]; y = r[k] / y; bigdiv (x, mm, m[k], n); x[n - 1] = bigmul (x, x, y, n - 1); if (bigadd (s, x, n) || bigcmp (s, mm, n) > 0) bigsub (s, mm, n); } moveraw (r, s, n); setmodulus (o); delete[] mm; delete[] x; delete[] s; }
int main() { SieveOfEratosthenes(Primes, 1000); srand(time(NULL)); char croaks[] = "PPPPNNPPPNPPNPN"; RunSimulations(); bignum numerator; bigset(numerator, 119); bignum denominator; bigset(denominator, 300); bignum temp1; bigset(temp1, 190); bignum temp2; bigset(temp2, 405); bignum temp3; biginit(temp3); bignum temp4; biginit(temp4); bignum temp5; biginit(temp5); int i; for(i = 1; i < 15; i++) { bigmulint(temp3,bigadd(temp3, temp1, temp2), 7695); bigsetbig(temp4, temp1); bigsetbig(temp5, temp2); bigadd(temp1, bigmulint(temp1, temp1, 81), bigmulint(temp5, temp5, 1805)); bigadd(temp2, bigmulint(temp2, temp2, 5890), bigmulint(temp4, temp4, 7614)); if(croaks[i] == 'P') bigmulint(temp1, temp1, 2); else bigmulint(temp2, temp2, 2); bigmul(numerator, numerator, bigadd(temp4, temp1, temp2)); bigmul(denominator, denominator, bigmulint(temp3,temp3,3)); char string1[1000]; char string2[1000]; biggetstr(string1, numerator); biggetstr(string2, denominator); printf("%s/%s\n", string1, string2); } char string1[1000]; char string2[1000]; biggetstr(string1, numerator); biggetstr(string2, denominator); printf("%s/%s\n", string1, string2); return 0; }