Frage

Sagen Sie, ich habe eine mehrstellige Ganzzahl in C. Ich möchte sie in einstellige ganze Ganzzahlen zerlegen.

123 würde sich in 1, 2, und 3.

Wie kann ich das tun, besonders wenn ich nicht weiß, wie viele Ziffern die Ganzzahl hat?

War es hilfreich?

Lösung

int value = 123;
while (value > 0) {
 int digit = value % 10;
 // do something with digit
 value /= 10;
}

Andere Tipps

Zählen Sie zuerst die Ziffern:

unsigned int count(unsigned int i) {
 unsigned int ret=1;
 while (i/=10) ret++;
 return ret;
}

Dann können Sie sie in einem Array aufbewahren:

unsigned int num=123; //for example
unsigned int dig=count(num);
char arr[dig];
while (dig--) {
 arr[dig]=num%10;
 num/=10;
}

Als Hinweis ist es ziemlich einfach, die n -te Ziffer in die Zahl zu bekommen. Teilen Sie sich um 10 n -mal, dann mod 10 oder in c:

int nthdig(int n, int k){
     while(n--)
         k/=10;
     return k%10;
}

Die letzten Ziffern von 123 sind 123 % 10. Sie können die letzte Ziffer von 123 abnehmen, indem Sie 123/10 durchführen. Mithilfe der Ganzzahl -Division erhalten Sie 12. Um Ihre Frage zu "Woher weiß ich, wie viele Ziffern Sie haben", beantworten Sie Ihre Frage. - Versuchen Sie es wie oben beschrieben und Sie werden sehen, wie Sie wissen, wann Sie aufhören müssen.

Ich denke, unterhalb des Stücks wird helfen ....

temp = num;
while(temp)
{
    temp=temp/10;
    factor = factor*10;
}

printf("\n%d\n", factor);
printf("Each digits of given number are:\n");

while(factor>1)
{
    factor = factor/10;
    printf("%d\t",num/factor);
    i++;
    num = num % factor;
}

Wir können dieses Programm als Funktion mit 3 Argumenten verwenden. Hier in "while (a ++ <2)" ist 2 die Anzahl der Ziffern, die Sie benötigen (können als ein Argument angeben) 2 ohne Ziffern ersetzen, die Sie benötigen. Hier können wir "z/= pow (10,6)" verwenden, wenn wir bestimmte Ziffern nicht benötigen, 6 durch die Anzahl der Ziffern ersetzen, die Sie nicht benötigen (können als ein anderes Argument angeben), und das dritte Argument ist Die Nummer, die Sie brechen müssen.

int main(){
long signed c=0,z,a=0,b=1,d=1;
scanf("%ld",&z);
while(a++<2){
       if(d++==1) 
       z/=pow(10,6);
       c+=(z%10)*b; 
       z/=10;
       b*=10;}
        return c;}
//Based on Tony's answer
#include <stdio.h> 
int nthdig(int n, int k){
    while(n--)
        k/=10;
    return k%10;
}

int main() {
    int numberToSplit = 987;
    printf("Hundreds = %i\n",nthdig(2, numberToSplit));
    printf("Tens     = %i\n",nthdig(1, numberToSplit));
    printf("Units    = %i\n",nthdig(0, numberToSplit));
}

Dies führt zum folgenden Ausdruck:

Hunderte = 9

Zehns = 8

Einheiten = 7

Ich habe dies basierend auf dem Code von @asaelr gemacht:

typedef struct digitsArrayPlusNumber {
    uint32_t *baseAddress;
    uint32_t number;
} digitsArrayPlusNumber;

digitsArrayPlusNumber *splitDigits (uint32_t inValue) {
    // based on code from asaelr@stackoverflow.com

    uint32_t inputValue = inValue;

    //Count digits

    uint32_t theCount = 1;
    while (inputValue /= 10)
        theCount++;

    // put in array
    uint32_t *arr = malloc(sizeof(uint32_t) * theCount);
    uint32_t dig = theCount;
    while (dig--) {
        arr[dig]=inValue % 10;
        inValue /= 10;
        //  printf ("%d\n", arr[dig]);
    }

    digitsArrayPlusNumber *dandn = malloc (sizeof(digitsArrayPlusNumber));

    dandn->baseAddress = arr;
    dandn->number = theCount;

    return dandn;

}

int main(int argc, const char * argv[]) {


    for (int d = 0; d < splitDigits(12345678)->number; d++)
        printf ("%u\n", (splitDigits(12345678)->baseAddress)[d]);

}

Es funktioniert ganz gut, danke!

Versuchen Sie diesen Code, wenn Sie die Ziffern in derselben Reihenfolge ohne Verwendung von Arrays trennen möchten.

//Separate number digits
#include <stdio.h>
#include <math.h>

void main()
{
    int x, y, n = 0;

    scanf("%d", &x);

    //counting digits
    y = x;
    while (y != 0)
    {
        n += 1;
        y /= 10;
    }

    //printing separated digits
    int i;
    for (i = ceil(pow(10, (n - 1))); i != 0; i /= 10)
        printf("%d  ", (x / i) % 10);
}

Sie können %10 verwenden, was den Rest bedeutet, wenn die Zahl nach der Aufteilung der Fall ist. So 123 % 10 IS 3, da der Rest 3 ist, substract die 3 von 123, dann 120, dann 120 mit 10, was 12 ist, und den gleichen Prozess durchführen.

Sie können teilen und erobern, aber Sie haben alle arithmetischen Bibliotheken neu schreiben. Ich schlage vor, eine Mehrfachversorgungsbibliothek zu verwenden https://gmplib.org Aber natürlich ist es eine gute Praxis

int l1; //123456 for example
scanf("%d",&l1);
char s[sizeof(l1)];
sprintf(s,"%5d",l1);'

//This will give you separate digits of the number in char format inside s[0],s[1] 
//and so on.

//If you want them in int format, declare a int array say int i[sizeof(l1)] and add 
//the following code

for(int c=1;c<=sizeof(l1);c++){
i[c] = s[c] - '0';
} 

//Now i[0], i[1] etc will have the digits in int format
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top