Я новичок в программировании, и я застрял в проблеме. Я хочу, чтобы моя программа идентифицировала отдельные цифры в заданном числе, например, если я ввожу 4692
, она должна идентифицировать цифры и печатать 4 6 9 2
. И да, без использования массивов.
Определите цифры в заданном числе.
Ответы (7)
Идеальная проблема рекурсии для решения, если вы новичок в программировании...
4692/1000 = 4
4692%1000 = 692
692/100 = 6
692%100 = 92
92/10 = 9
92%10 = 2
Вы должны получить представление о цикле, который вы должны использовать сейчас, чтобы он работал для любого числа. :)
Не писал код C год, но это должно работать.
int i = 12345;
while( i > 0 ){
int nextVal = i % 10;
printf( "%d", nextVal );
i = i / 10;
}
i
5 раз: 123451234123121. Даже если вы печатаете nextVal
вместо i
, вы делаете это в неправильном порядке и напечатаете 54321.
- person Jacob Krall; 29.09.2009
Просто и приятно
void PrintDigits(const long n)
{
int m = -1;
int i = 1;
while(true)
{
m = (n%(10*i))/i;
i*= 10;
cout << m << endl;
if (0 == n/i)
break;
}
}
Другой подход состоит в том, чтобы иметь две петли.
1) Первая петля: перевернуть число.
int j = 0;
while( i ) {
j *= 10;
j += i % 10;
i /= 10;
}
2) Второй цикл: печатайте числа справа налево.
while( j ) {
std::cout << j % 10 << ' ';
j /= 10;
}
Это предполагает, что вы хотите, чтобы цифры печатались справа налево. Я заметил, что здесь есть несколько решений, в которых нет этого предположения. Если нет, то достаточно будет второго цикла.
i
заканчивается нулями, потому что тогда j
останется равным нулю в начале, и умножение его на 10 не окажет на него никакого влияния.
- person Felix Jassler; 21.03.2021
Я думаю, что идея состоит в том, чтобы напечатать неповторяющиеся цифры (иначе это было бы слишком просто)... ну, вы можете отслеживать уже напечатанные целые числа, не имея массива, кодирующего их в другое целое число.
какой-то псевдо C, чтобы дать вам подсказку:
int encoding = 0;
int d;
while (keep_looking()) {
d = get_digit();
if (encoding/(2**d)%2 == 0) {
print(d);
encoding += 2**d;
}
}
d**2
? Я думаю, вы имеете в виду d*d
.
- person pmg; 30.09.2009
**
- это оператор возведения в степень Фортрана. C не имеет оператора возведения в степень. Вы можете заменить 2**d
на 1 << d
.
- person pmg; 30.09.2009
Вот простое решение, если вы хотите просто напечатать цифры из числа.
#include <stdio.h>
/**
printdigits
*/
void printDigits(int num) {
char buff[128] = "";
sprintf(buff, "%d ", num);
int i = 0;
while (buff[i] != '\0') {
printf("%c ", buff[i]);
i++;
}
printf("\n");
}
/*
main function
*/
int main(int argc, char** argv) {
int digits = 4321;
printDigits(digits);
return 0;
}
buff
, если вы просто собираетесь перезаписать его sprintf()
позже? Кроме того, зачем вам char *p
, если вы никогда его не используете?
- person Chris Lutz; 29.09.2009
int
может содержать только числа до 4 миллиардов на большинстве платформ, поэтому вы должны быть в безопасности с 10 цифрами (11 символов с нулевым терминатором). Если вас беспокоит 64-битность, это всего лишь от 20 до 25 символов.
- person Chris Lutz; 29.09.2009
Это правильно
int main()
{
int number;
cin>>number;
int nod=0;
int same=number;
while(same){
same/=10;
nod++;
}
while(nod--){
cout<<(int)number/(int)pow10(nod)%10<<"\t";
}
return 0;
}