Я хочу разбить многозначное число на C. Скажем, у меня есть int 123
как разбить его на 1,2,3?
что, если я не знаю, сколько цифр есть? Я ищу хорошую математическую формулу здесь
Я хочу разбить многозначное число на C. Скажем, у меня есть int 123
как разбить его на 1,2,3?
что, если я не знаю, сколько цифр есть? Я ищу хорошую математическую формулу здесь
int value = 123;
while (value > 0) {
int digit = value % 10;
// do something with digit
value /= 10;
}
Сначала подсчитайте цифры:
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;
}
Как подсказка, получение n-й цифры в номере довольно легко; разделите на 10 n раз, затем mod 10 или в C:
int nthdig(int n, int k){
while(n--)
k/=10;
return k%10;
}
Последние цифры 123 составляют 123% 10. Вы можете удалить последнюю цифру 123, выполнив 123/10 - используя целочисленное деление, это даст вам 12. Чтобы ответить на ваш вопрос "как узнать, сколько цифр у вас есть", попробуйте сделать это, как описано выше, и вы увидите, как узнать, когда остановиться.
Я думаю, что ниже код кода поможет....
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;
}
Попробуйте этот код, если вы хотите разделить цифры в том же порядке, не используя массивы.
//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);
}
мы можем использовать эту программу как функцию с тремя аргументами. В "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;}
//Based on Tony 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
Tens = 8
Единицы = 7
Я сделал это на основе кода из @asaelr:
typedef struct digitsArrayPlusNumber {
uint32_t *baseAddress;
uint32_t number;
} digitsArrayPlusNumber;
digitsArrayPlusNumber *splitDigits (uint32_t inValue) {
// based on code from [email protected]
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]);
}
Это работает очень хорошо, спасибо!
Вы можете использовать% 10, что означает остаток, если номер после его разделения. Итак, 123 % 10
равно 3, потому что остаток равен 3, вычтите 3 из 123, затем он равен 120, затем разделите 120 на 10, равный 12. И выполните тот же процесс.
Вы можете разделить и победить, но вы переписали все арифметические библиотеки. Я предлагаю использовать библиотеку с несколькими точками https://gmplib.org Но, конечно, это хорошая практика