Скажем, у меня есть многозначное целое число в C. Я хочу разбить его на однозначные целые числа.
123
превратится в 1
, 2
и 3
.
Как я могу это сделать, особенно если я не знаю, сколько цифр имеет целое число?
Скажем, у меня есть многозначное целое число в C. Я хочу разбить его на однозначные целые числа.
123
превратится в 1
, 2
и 3
.
Как я могу это сделать, особенно если я не знаю, сколько цифр имеет целое число?
Сначала посчитаем цифры:
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 раз, затем по модулю 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;
}
//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
Я сделал это на основе кода @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. И проделайте тот же процесс.
мы можем использовать эту программу как функцию с 3 аргументами. Здесь в «пока (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;}
Вы можете разделять и властвовать, но вам придется переписать все арифметические библиотеки. Я предлагаю использовать многоточную библиотеку https://gmplib.org. Но, конечно, это хорошая практика.
char
(ввод от пользователя или текстового файла...), не преобразовывайте в int в первую очередь (безscanf
, безatoi
...) и используйте символы для разделения цифр. - person pmg   schedule 16.02.2012