2011-12-29 10 views
5

私は1191223 のような整数を持ち、数字を反復したい。私はCでこれを行う方法がわかりませんが、これを行う簡単な方法はありますか?Cの整数の数字を反復する

ありがとうございました。

答えて

4

以下では、10進数(10進数)を想定しています。おそらく、あなたは10を代用することで、他の数値システムにソリューションを適合させることができます。

モジュロ演算は、負のオペランドに関するトリッキーなことです。したがって、データ型を符号なし整数に選択しました。

あなたが最初の最下位桁を処理したい場合は、次のテストされていないアプローチを試みることができる:あなたは最上位桁から始まる数字を歩くことを好む場合

uint32_t n = 1191223; 
do { 
    uint32_t digit = n%10; 
    // do something with digit 
} 
while (n/=10); 

を、あなたは適応しようとすることができ以下の未テストコード:

uint32_t n = 1191223; 
#define MAX_DIGITS 10 // log10((double)UINT32_MAX)+1 
uint32_t div = pow(10, MAX_DIGITS); 

// skip the leading zero digits 
while (div && !(n/div)) div/=10; 
if (!div) div = 10; // allow n being zero 

do { 
    uint32_t digit = (n/div)%10; 
    // do something with digit 
} 
while (div/=10); 
0

このような何か:

char data[128]; 
int digits = 1191223; 
sprintf(data, "%d", digits); 
int length = strlen(data); 
for(int i = 0; i < length; i++) { 
    // iterate through each character representing a digit 
} 

0100のような8進数を使用する場合は、sprintf(data, "%d", digits);sprintf(data, "%o", digits);に変更する必要があることにも注意してください。

+0

Krister、私の数字の開始が「0」であれば、私に間違った長さが与えられていますが、その理由は分かりますか? Btwの人々は本当に上記のすべての答えが好きです。 – kforkarim

+0

@kforkarim - 私は8進数を扱うためのアップデートを追加しました - 0から始まる数字 – Cyclonecode

3

基本10桁を繰り返していますが、整数にはアラビア語表記と数字の概念がありません。最初の文字列に変換します

int i = 1191223; 
char buffer[16]; 
char *j; 
snprintf(buffer, 16, "%i", i); 
for (j = buffer; *j; ++j) { /* digit is in *j - '0' */ } 
+0

thiton私はちょうどあなたがここで* j - '0'で何を意味するのか不思議です、最初の0を避けますか?私は0191223の数字でこれを試していましたが、長さは正しいとは思われません。 – kforkarim

+1

@kforkarimおそらくそれは 'char2int'変換です:' uint32_t digit = * j-'0 '; '。文字列に含めることができる '' - ''を必ず処理してください。 – moooeeeep

0

ハック方法は、数にこれを(strtolは参照)を文字列にこれを変換して再変換することです。 あなたが私の頭の上からcharacter you want - '0'

0

のようなものを使用することができます:「私%100000」、「私は%100000」を、...

再帰的な解決策は、あなたが「私%10」から始めましょうう。

1

あなたはchar配列に変換するsprintf()を使用してから、そのように、それを反復処理することができます(未テスト、ちょうどあなたが始めるために):

int a = 1191223; 
char arr[16]; 
int rc = sprintf(arr, "%d", a); 

if (rc < 0) { 
    // error 
} 

for (int i = 0; i < rc; i++) { 
    printf("digit %d = %d\n", i, arr[i]); 
} 
1
void access_digits(int n) 
{ 
     int digit; 
     if (n < 0) n = -n; 
     do { 
       digit = n % 10; 
       /* Here you can do whatever you 
        want to do with the digit */ 
     } while ((n/=10) > 0); 
} 
8

転送し、または後方?

正の整数と仮定すると:

EDIT ...

unsigned int n = 1191223; 

    while (n != 0) { 
     doSomething (n % 10); 
     n /= 10; 
    } 

が...最大の最小動作しますか、私はすべて私がここに持っていた、この非作動溶液について忘れてい。Very Smart People™は一貫して最小のものから最大のものを使用しているようです(LinuxカーネルとGLibCの両方ともprintfのように、逆順に繰り返します)。実際には使用したくない場合は、これを行うのは難しい方法です。snprintf何らかの理由で...

int left_to_right (unsigned int n) { 
    unsigned int digit = 0; 

    if (0 == n) { 
    doSomething (0); 
    } else { 
    digit = pow(10, 1.0+ floor(log10(n))); 
    while (digit /= 10) { 
     doSomething ((n/digit) % 10); 
    } 
    } 
} 

私はそれはあなたがlog10powではなくsnprintfを持っていることを前提とするのは非常に愚かだと仮定し、その代替案は、「あなたが本当にドン場合、

int left_to_right_fixed_max (unsigned int n) { 
    unsigned int digit = 1000000000; /* make this very big */ 
    unsigned int n10 = 10 * n; 

    if (0 == n) { 
    doSomething (0); 
    } else { 
    while (digit > n10) { digit /= 10; } 
    while (digit /= 10) { 
     doSomething ((n/digit) % 10); 
    } 
    } 
} 

こと...かでしょうハードウェアの乗算/除算がある場合は、 10の力を持つことができる。私はもう少し汎用的なバージョンへhttp://www.piclist.com/techref/language/ccpp/convertbase.htmから適応している

int left_to_right (unsigned int n) { 
    static const unsigned int digit [] = 
    { 1, 
     10, 
     100, 
     1000, 
     10000, 
     100000, 
     1000000, 
     10000000, 
     100000000, 
     1000000000 /* make this very big */ 
    }; 
    static const unsigned char max_place = 10; 
    /* length of the above array */ 

    unsigned char decimal; 
    unsigned char place; 
    unsigned char significant = 0; /* boolean */ 

    if (0 == n) { 
    doSomething (0); 
    } else { 
    place = max_place; 
    while (place--) { 
     decimal = 0; 
     while (n >= digit[place]) { 
     decimal++; 
     n -= digit[place]; 
     } 
     if (decimal | significant) { 
     doSomething (decimal); 
     significant |= decimal; 
     } 
    } 
    } 
} 

...。

+0

あなたの最初のバージョンは後方から前方に向かっていますが、1234> 1 2 3、4ではなく4 3 2と1のように前方と上の数字をどうやって取得しますか? – kforkarim

+0

ありがとうございます。なぜそれをやっているのか? – kforkarim

+0

うわー、私はいくつかの愚かな監視を作ったと確信しています - 私は今夜見てみましょう。私は奇妙なことに、 "1191123"と試してみました。 – BRFennPocock