Ваша проблема в том, что ваш модуль является остатком, если вы математически думаете о том, что вы делаете, это не имеет смысла. Когда вы делите число на другое число, есть либо остаток, либо его нет. Вы продолжаете в цикле до тех пор, пока есть или нет остаток. Это приводит к целочисленному переполнению на p.
Попробуйте это:
#include <iostream>
using namespace::std;
int main()
{
// this prints out the digits backwards:
for(int InitialNumber=110;InitialNumber!=0;InitialNumber/=10){
int LastDigit=InitialNumber%10;
cout<<LastDigit<<endl;
}
return 0;
}
Выход:
martyn@localhost ~ $ g++ test.cpp -std=c++11
martyn@localhost ~ $ ./a.out
0
1
1
Если вы сохранили свой алгоритм, вы можете завершить его следующим образом:
int main()
{
int p = 10;
int j = 1;
while( p < 110*10 ){
cout<<110 % p<<endl;
j++;
p = p *10;
}
}
Это остановило бы цикл, продолжающийся вечно и переполняющий P. И это дало бы вам:
martyn@localhost ~ $ ./a.out
0
10
110
Я подозреваю, что это не то, что вы хотели, вместо этого вы хотели бы просто иметь первую цифру, поэтому вам нужно разделить вывод на предыдущую степень десяти следующим образом:
int main()
{
int p = 10;
while( p < 110*10 ){
cout<<(110 % p)/(p/10)<<endl;
p = p * 10;
}
}
И это даст вам:
martyn@localhost ~ $ g++ test.cpp -std=c++11
martyn@localhost ~ $ ./a.out
0
1
1
Но я подозреваю, что первый фрагмент кода более элегантен. Обратите внимание, что во всех этих примерах цифры печатаются задом наперед. Это может быть не то, что вы хотите.