1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
u4 atou4( const char *str, size_t len) { u4 ret=0; for ( size_t i=0;i<len;i++) { ret=ret*10+(str[i]- '0' ); } return ret; } void bigint_ato_i( const char *str, size_t len, bigint *dest) { if (len==0)len= strlen (str); for ( size_t i=0;i<len;i++) { if (! isdigit (str[i]))len=i; } bigint_setu4(dest, 0); if (len==0) return ; bigint temp; u4 srcsize=(len+8)/9; u4 fdigit=(len-1)%9+1; bigint_create(srcsize, &temp); temp.dats[srcsize-1]=atou4(str, fdigit); for (u4 i=0;i<srcsize-1;i++) { temp.dats[srcsize-2-i]=atou4(str+fdigit+i*9, 9); } for (u4 i=0;i<dest->len;i++) { for (u4 bit=0;bit<32;bit++) { if (temp.dats[0]&1)dest->dats[i]|=(1<<bit); bigint_shru4(&temp, 1); bigint_shrink_i(&temp); for (u4 j=0;j<temp.len;j++) { if (temp.dats[j]>=2147483648)temp.dats[j]-=1647483648; } } } bigint_release(&temp); } void bigint_ato( const char *str, size_t len, bigint *dest) { if (len==0)len= strlen (str); if (*str== '-' ) { bigint_ato_i(str+1, len-1, dest); bigint_neg(dest); } else if (*str== '+' ) { bigint_ato_i(str+1, len-1, dest); } else { bigint_ato_i(str, len, dest); } } |
BigFloat로 Pi를 구해보자-1. 구조체 정의, 기초 조작 (0) | 2012.10.16 |
---|---|
BigFloat로 Pi를 구해보자-0. 시작하며 (1) | 2012.10.16 |
드디어 오류를 잡아냈다. (2) | 2010.09.11 |
BigInteger를 구현해보자 - 9. 10진수로 출력하기(코드) (0) | 2009.04.26 |
BigInteger를 구현해보자 - 8. 10진수로 출력하기(알고리즘) (3) | 2009.04.26 |
BigInteger를 구현해보자 - 7. 나누기 (2) | 2009.04.25 |
댓글 영역