c中另一个数的每第k位组成的数

A number formed by every k-th digit of another number in c

给定一些自然数 n 和 k,我的目标是编写一个 C 程序,输出由 n 的每个第 k 位数字组成的数字。我写了一个程序如下:

#include <stdio.h>
#include <math.h>
#define MAX 100
  
void printDigit(int n, int k)
{
    int arr[MAX];
    int i = 0;
    int j, r;
  
    while (n != 0) {
        r = n % (int)pow(10,k);
        arr[i] = r;
        i++;
        n = n / pow(10,k);
    }
  
    for (j = i - 1; j > -1; j--) {
        printf("%d ", arr[j]);
    }
}
  
int main()
{
    int n = 12345678;
    int k = 2;
  
    printDigit(n,k);
    return 0;
}

我的代码输出相同的数字,但分成长度为 k 的子字符串。为什么会这样,我该如何解决才能得到我想要的号码?

n % (int)pow(10,k)n的低k位。如果您只想要一个数字,请使用 n % 10.

因为 pow(10, k) returns a double,它可能不是一个精确的整数。您应该将它舍入到最接近的整数以进行正确的除法。

void printDigit(int n, int k)
{
    int arr[MAX];
    int i = 0;
    int j, r;
    int divisor = lround(pow(10, k));
  
    while (n != 0) {
        r = n % 10;
        arr[i] = r;
        i++;
        n = n / divisor;
    }
  
    for (j = i - 1; j > -1; j--) {
        printf("%d ", arr[j]);
    }
}

你的逻辑太复杂了,如果你想坚持下去:

int intpow(int x, int y)
{
    int result = 1;
    while(y--) result *= x;
    return result;
}

void printDigit(int n, int k)
{
    int arr[MAX];
    int i = 0;
    int j, r, powv;
  
    while (n != 0) {
        powv = intpow(10,k -1);
        n /= powv;
        if(!n) break;
        r = n % 10;
        arr[i] = r;
        i++;
        n = n / 10;
    }
  
    for (j = i - 1; j > -1; j--) {
        printf("%d ", arr[j]);
    }
}