答えて
以下では、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);
このような何か:
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);
に変更する必要があることにも注意してください。
基本10桁を繰り返していますが、整数にはアラビア語表記と数字の概念がありません。最初の文字列に変換します
int i = 1191223;
char buffer[16];
char *j;
snprintf(buffer, 16, "%i", i);
for (j = buffer; *j; ++j) { /* digit is in *j - '0' */ }
ハック方法は、数にこれを(strtolは参照)を文字列にこれを変換して再変換することです。 あなたが私の頭の上からcharacter you want - '0'
のようなものを使用することができます:「私%100000」、「私は%100000」を、...
再帰的な解決策は、あなたが「私%10」から始めましょうう。
あなたは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]);
}
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);
}
転送し、または後方?
正の整数と仮定すると:
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);
}
}
}
私はそれはあなたがlog10
とpow
ではなく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;
}
}
}
}
...。
あなたの最初のバージョンは後方から前方に向かっていますが、1234> 1 2 3、4ではなく4 3 2と1のように前方と上の数字をどうやって取得しますか? – kforkarim
ありがとうございます。なぜそれをやっているのか? – kforkarim
うわー、私はいくつかの愚かな監視を作ったと確信しています - 私は今夜見てみましょう。私は奇妙なことに、 "1191123"と試してみました。 – BRFennPocock
- 1. 整数の数字をどのように反復するのですか?
- 2. PL/pgSQLで整数[]を反復する
- 3. 整数のビットを反復するPythonの方法
- 4. 数字の配列中の数字の最高の反復を数えるためのCプログラム
- 5. Rキャレットパッケージの反復回数を調整する方法
- 6. オプションの整数リストを反復するifPresent
- 7. Zip C++の複数の反復子
- 8. C++可変テンプレート引数の反復
- 9. 反復ネイティブの反復関数
- 10. JSF/Richfaces反復の反復スコープ変数?
- 11. C++の整数または反復子とのループの相違点
- 12. 関数の反復
- 13. C++でクラスオブジェクトの文字列変数を反復処理する方法は?
- 14. 文字列反復C#モノ
- 15. 点の反復子を調整する
- 16. C++ STL、定数反復子、find()
- 17. 各文字の反復回数をカウントする配列
- 18. C#.Net多数のファイルを反復処理中にフリーズする
- 19. 文字列のセットに対する変数の反復
- 20. 非反復乱数のための再帰ループと整数配列の使用
- 21. 複数のデータテーブルを反復する
- 22. 複数のパンダシリーズを反復する
- 23. 複数のファイルアップロードフィールドを反復する
- 24. 整数FM復調
- 25. 整数で特定のビットを反転する(C言語)
- 26. Objective-Cの文字への整数
- 27. 反復関数を反復型に変更する
- 28. itertools.productの反復引数
- 29. Webcrawler複数ページの反復
- 30. 変数名の反復
Krister、私の数字の開始が「0」であれば、私に間違った長さが与えられていますが、その理由は分かりますか? Btwの人々は本当に上記のすべての答えが好きです。 – kforkarim
@kforkarim - 私は8進数を扱うためのアップデートを追加しました - 0から始まる数字 – Cyclonecode