Mam liczbę całkowitą jak 1191223 i chcę iterować nad cyfr. Nie jestem pewien, jak to zrobić w C, czy jest jakiś łatwy sposób to zrobić?Iterowanie za pomocą cyfr w liczbie całkowitej w C
Dzięki.
Mam liczbę całkowitą jak 1191223 i chcę iterować nad cyfr. Nie jestem pewien, jak to zrobić w C, czy jest jakiś łatwy sposób to zrobić?Iterowanie za pomocą cyfr w liczbie całkowitej w C
Dzięki.
Zakładam, że rozumiesz jako cyfry dziesiętne (podstawa 10). Prawdopodobnie jesteś w stanie dostosować rozwiązania do innych systemów liczbowych, zastępując je 10
.
Należy zauważyć, że operacja modulo jest trudna w przypadku ujemnych argumentów. Dlatego wybrałem typ danych jako niepodpisaną liczbę całkowitą.
Jeśli chcesz przetwarzać najmniej znaczącą cyfrę pierwszą, można wypróbować następujące niesprawdzone podejście:
uint32_t n = 1191223;
do {
uint32_t digit = n%10;
// do something with digit
}
while (n/=10);
Jeśli wolisz chodzić przez cyfr zaczynając od najbardziej znaczącej cyfry, można starać się dostosować następujący kod niesprawdzone:
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);
coś takiego:
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
}
Należy zauważyć, że w przypadku użycia liczby ósemkowej, takiej jak 0100
, należy również zmienić wartość sprintf(data, "%d", digits);
na sprintf(data, "%o", digits);
.
Chcesz dokonać iteracji po dziesięciocyfrowych cyfrach, ale liczba całkowita nie ma pojęcia arabskiej notacji i cyfr. Przekonwertować go do pierwszego łańcucha:
int i = 1191223;
char buffer[16];
char *j;
snprintf(buffer, 16, "%i", i);
for (j = buffer; *j; ++j) { /* digit is in *j - '0' */ }
thiton Jestem po prostu ciekawy co masz na myśli tutaj przez * j - '0', czy unika pierwszego 0? Próbowałem to z cyfrą 0191223 i długość nie wydaje się być właściwa, jakieś sugestie? – kforkarim
@kforkarim prawdopodobnie jest to konwersja 'char2int':' uint32_t digit = * j-'0 '; '. Upewnij się, że obsługuje '' -'', który może zawierać ciąg znaków. – moooeeeep
hackish sposobem jest przekonwertować to ciąg (patrz strtol), a następnie do przestawienia tego numeru. można użyć coś takiego character you want - '0'
Off górze mojej głowie: "I% 100000", "I% 100000" ...
rekurencyjna rozwiązanie pozwoli Ci zacząć od "I% 10" .
Można użyć sprintf()
aby przekształcić go w char
tablicy, a następnie iterację, że jak tak (niesprawdzone, żeby zacząć grę):
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);
}
przodu, lub do tyłu?
Zakładając dodatnia:
unsigned int n = 1191223;
while (n != 0) {
doSomething (n % 10);
n /= 10;
}
... zadziała najmniejszego do największego, albo ...
EDIT Zapomniałam o tym nieprodukcyjnym rozwiązania miałem tutaj.Zauważ, że funkcja Very Smart People ™ wydaje się używać konsekwentnie od najmniejszej do największej iteracji (zarówno jądro Linux, jak i GLibC's printf
, na przykład po prostu iterować do tyłu), ale tutaj jest kiepski sposób, aby to zrobić, jeśli naprawdę nie chcesz używać snprintf
z jakiegoś powodu ...
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);
}
}
}
Zakładam, że jest to bardzo głupie zakładać, że masz log10
i pow
ale nie snprintf
, więc alternatywny projekt byłby
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);
}
}
}
... lub, jeśli naprawdę don” • Masz sprzęt pomnożyć/podzielić, możesz uciec się do używania at w stanie mocy dziesięciu.
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;
}
}
}
}
... co mam z http://www.piclist.com/techref/language/ccpp/convertbase.htm dostosowany do nieco większej wersji ogólnego przeznaczenia.
Twoja pierwsza wersja jest od początku do przodu, jak uzyskać cyfry od przodu i do góry, jak 1234> 1 2 3, a następnie 4 raczej 4 3 2 i 1 .. dzięki – kforkarim
iteracja działa dobrze na przyszłość, ale jej pomijanie zero, żadnych pomysł, dlaczego to robi? – kforkarim
Wow, jestem pewien, że popełniłem jakiś głupi niedopatrzeń - przyjrzę się dziś wieczorem. :-(Głupio tylko wypróbowałem to z "1191123!" – BRFennPocock
Krister, Jeśli moja cyfra zaczyna się od "0", to daje mi to złą długość, czy wiesz dlaczego? Btw ludzie naprawdę lubią wszystkie odpowiedzi powyżej. – kforkarim
@kforkarim - Dodałem aktualizację do obsługi liczb ósemkowych - numery zaczynające się od '0' – Cyclonecode