C:如何将一个多位数分解成不同的变量?

C:如何将一个多位数分解成不同的变量?,c,math,numbers,digits,digit,C,Math,Numbers,Digits,Digit,假设我在C中有一个多位数的整数,我想把它分解成一位数的整数 123将变成1、2和3 我怎样才能做到这一点,特别是如果我不知道整数有多少位的话?作为提示,获取数字中的第n位非常容易;除以10 n次,然后取模10,或以C表示: int nthdig(int n, int k){ while(n--) k/=10; return k%10; } 123的最后一位数字是123%10。 您可以通过执行123/10来删除123的最后一位数字——使用整数除法将得到12。

假设我在C中有一个多位数的整数,我想把它分解成一位数的整数

123
将变成
1
2
3


我怎样才能做到这一点,特别是如果我不知道整数有多少位的话?

作为提示,获取数字中的第n位非常容易;除以10 n次,然后取模10,或以C表示:

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

123的最后一位数字是123%10。 您可以通过执行123/10来删除123的最后一位数字——使用整数除法将得到12。 回答您关于“我如何知道您有多少位数”的问题--
尝试按上述方法操作,您将看到如何知道何时停止。

首先,计算数字:

unsigned int count(unsigned int i) {
 unsigned int ret=1;
 while (i/=10) ret++;
 return ret;
}
然后,您可以将它们存储在阵列中:

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

我认为下面的代码将有助于

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;
}

我们可以使用这个程序作为一个有3个参数的函数 #包括 int-nthdig(int-n,int-k){ 而(n--) k/=10; 返回k%10; } int main(){ int numberToSplit=987; printf(“百分之i\n”,第n个数字(2,numberToSplit)); printf(“Tens=%i\n”,nthdig(1,numberToSplit)); printf(“单位=%i\n”,第n个数字(0,numberToSplit)); } 这将导致以下打印输出:

百分之九

十=8


单位=7

我是根据@asaelr的代码制作的:

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]);

}
typedef结构digitsArrayPlusNumber{
uint32_t*基址;
uint32_t编号;
}digitsArrayPlusNumber;
digitsArrayPlusNumber*拆分数字(uint32无效){
//基于源代码asaelr@stackoverflow.com
uint32\u t输入值=无效;
//数数数字
uint32_t计数=1;
while(inputValue/=10)
count++;
//排列
uint32_t*arr=malloc(单位:uint32_t)*计数);
uint32\u t dig=计数;
而(挖--){
arr[dig]=无效%10;
无效/=10;
//printf(“%d\n”,arr[dig]);
}
digitsArrayPlusNumber*dandn=malloc(sizeof(digitsArrayPlusNumber));
dandn->baseAddress=arr;
dandn->number=计数;
返回dandn;
}
int main(int argc,const char*argv[]{
对于(int d=0;dnumber;d++)
printf(“%u\n”)(拆分数字(12345678)->基址)[d];
}

它工作得很好,谢谢!

你可以分而治之,但你已经重写了所有的算术库。我建议使用多精度库,但这当然是一个好的实践

你可以使用%10,这意味着如果你把它除以之后的数字就可以得到余数。因此
123%10
是3,因为余数是3,所以减去从123取3,然后是120,然后用10除以120,10等于12。然后执行相同的过程。

如果您的int作为
char
数据(从用户或文本文件输入…)开始使用,首先不要转换为int(无
scanf
,无
atoi
)使用字符来分离数字。这不是第n个数字,这是从最小意义开始的第n个数字,你不认为最低有效数字是零。嗯,我认为第一或第123个数字是1,而不是3。
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));
}
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]);

}