2016-09-20 9 views
1

ibを入力ベース、obを出力ベースとします。 strは、任意の大きい整数xのASCII表現です。 fの戻り型は、この整数のベースob数字を含むint配列である...数字列を任意の大きな整数に格納する方法は?

f(str="1234567890", ib=10, ob=16) = {4, 9, 9, 6, 0, 2, 13, 2} 

:私のようなfを定義する必要があります。 2 >= ob <= MAX_INT2 >= ib <= 10、およびstrは常に有効な文字列になります(負の値は必要ありません)。

+1

ゼロ終端されたint配列はどのように見えますか?あなたの例では、 '{4,9,9,6、0,2,13,2,0}'はゼロ終了したなら '{4,9,9,6} 'となるでしょう。 – 4386427

+0

@Welbog、まあ、直感的に、私はそれに対処するために対数を使用します。 – qleguennec

+0

@ 4386427あなたは正しいです、それに気付かなかった。編集。 – qleguennec

答えて

0

何かがOPを開始するが、OPがコーディングの経験を楽しむのに十分である。

// form (*d) = (*d)*a + b 
static void mult_add(int *d, size_t *width, int ob, int a, int b) { 
    // set b as the carry 
    // for *width elements, 
    // x = (Multiply d[] by `a` (using wider than int math) and add carry) 
    // d[] = x mod ob 
    // carry = x/ob 
    // while (carry <> 0) 
    // widen d 
    // x = carry 
    // d[] = x mod ob 
    // carry = x/ob 
} 

int *ql_f(const char *src, int ib, int ob) { 
    // Validate input 
    assert(ib >= 2 && ib <= 10); 
    assert(ob >= 2 && ob <= INT_MAX); 
    assert(src); 

    // Allocate space 
    size_t length = strlen(src); 
    // + 2 + 4 is overkill, OP to validate and right-size later 
    size_t dsize = (size_t) (log(ib)/log(ob)*length + 2 + 4); 
    int *d = malloc(sizeof *d * dsize); 
    assert(d); 

    // Initialize d to zero 
    d[0] = 0; 
    size_t width = 1; 
    while (*src) { 
    mult_add(d, &width, ob, ib, *src - '0'); 
    src++; 
    } 

    // add -1 to end, TBD code 

    return d; 
} 
0

これは古い仕様で書いてありますので、これ以上有効ではありませんが、それは出発点として有用かもしれません。

コードはlong longの大きさを処理できます。 Cで任意の精度の数値に行くことは大きな飛躍です!

0の代わりに-1を終了マーカーとして使用することに注意してください。 ibを2〜36、任意のobと指定できます。

mainを含みます。

機能fは、ではありません。リエントラントです。スレッドセーフにするために、必要なメモリを割り当ててからポインタを返します。最も簡単なプロトコルは、後でメモリを解放する責任を呼び出し元に依頼することです。

#include <stdlib.h> 
#include <limits.h> 
#include <stdio.h> 

int *f(const char *str, int ib, int ob) { 
    static int result[CHAR_BIT * sizeof(long long) + 1]; 
    int i = sizeof(result)/sizeof(int) - 1; 
    long long l = strtoll(str, NULL, ib); 
    result[i--] = -1; 
    while (l) { 
     result[i] = l % ob; 
     l /= ob; 
     i--; 
    } 
    return result + i + 1; 
} 

int main() 
{ 
    int *x = f("1234567890", 16, 10); 
    while (*x > -1) { 
     printf("%d ", *x); 
     x++; 
    } 
    return 0; 
} 
関連する問題