28

假设我在 C 中有一个多位整数。我想将其分解为个位整数。

123会变成1,23.

我该怎么做,特别是如果我不知道整数有多少位?

4

10 回答 10

48
int value = 123;
while (value > 0) {
 int digit = value % 10;
 // do something with digit
 value /= 10;
}
于 2012-02-15T22:52:02.883 回答
8

首先,计算数字:

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;
}
于 2012-02-15T22:55:06.703 回答
1

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

int nthdig(int n, int k){
     while(n--)
         k/=10;
     return k%10;
}
于 2012-02-15T22:51:38.077 回答
1

123 的最后一位是 123 % 10。您可以通过执行 123/10 删除 123 的最后一位 - 使用整数除法,这将为您提供 12。回答您关于“我怎么知道您有多少位数”的问题-- 尝试按照上述方法进行操作,您将了解如何知道何时停止。

于 2012-02-15T22:53:16.627 回答
0

我认为下面的代码会有所帮助....

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;
}
于 2013-11-01T16:31:44.743 回答
0
//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));
}

这将导致以下打印输出:

数百 = 9

十位 = 8

单位 = 7

于 2017-04-17T21:50:51.703 回答
0

我是根据@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]);

}

它工作得很好,谢谢!

于 2017-06-17T19:48:37.110 回答
0

您可以使用 %10,表示除数后的余数。3也是123 % 10,因为余数是 3,从 123 中减去 3,然后是 120,然后将 120 除以 10,即 12。并执行相同的过程。

于 2017-12-21T21:22:40.977 回答
-2

我们可以将此程序用作具有 3 个参数的函数。在“while(a++<2)”中,2 是您需要的位数(可以作为一个参数给出)将 2 替换为您需要的位数。在这里我们可以使用 "z/=pow(10,6)" 如果我​​们不需要最后的某些数字,将 6 替换为您不需要的数字(可以作为另一个参数),第三个参数是你需要打破的数字。

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;}
于 2015-09-13T13:53:37.523 回答
-3

你可以分而治之,但你已经重写了所有的算术库。我建议使用多精度库https://gmplib.org但当然这是一个好习惯

于 2017-09-15T22:04:28.843 回答