当我们看到123,233,66666之类的数字时,人眼读入数字的逻辑是从左往右。当需要检查数字有多长时,对于短数字,我们能一眼看出。对于长数字,则需要从从左到右,仔仔细细心中默念,眼中默看。
对于计算机而言,处理数字同理。这里有两种通常方法,一是从高位到低位处理,二是从低位到高位处理。
以123456789为例,如果计算机选第一种,从高到低。得到第一位1则需要123456789/(10的8次方)=1,第二位需要123456789%(10的8次方)=23456789,再23456789/(10的7次方)=2。等等直到长数字为0。得到每位数字都需要计算次方、求余、除法、循环赋值四步。(得到最高位的数字权重需要先遍历一遍数字,方便起见单独写作一个函数)
int GetWeight(long long number)
{
if (number == 0) //特殊情况0
{
return 1;
}
int sum = 0;
while (number != 0) //丢最低位来计数
{
++sum;
number /= 10;
}
return sum;
}
void function(long long number) //从高到低
{
if (number == 0) //特殊情况0
{
cout << 0 << endl;
return;
}
//计算最高位的权重
int weight = static_cast<int>(pow(10, GetWeight(number)-1));
while (weight != 0) //循环得到最高位数字
{
cout << number / weight << " ";
number %= weight;
weight /= 10;
}
return;
}
如果计算机选第二种,从低到高。先得到最低位9:123456789%10=9。再得到8:123456789/10=12345678。12345678%10=8。等等直到长数字为0。可见得到每位数字需要求余、除法、循环赋值三步。
void function(long long number) //从低到高
{
if (number == 0) //特殊情况0
{
cout << 0 << endl;
return;
}
while (number != 0) //循环得到最低位数字
{
cout << number % 10 << " ";
number /= 10;
}
return;
}
通过对比发现,对计算机而言,从低到高相比从高到低步骤更少更快速,更常用。这就是人与计算机的区别。人要的是直观,从左到右按逻辑来。计算机需要的是快速,为此取最低位,丢最低位循环,这是人所不能接受的。
计算机从低到高的逻辑可以做到更多的事。遍历每位后,除了可以得到长数字的位数,还可以得到每位数字的任意进制的值。上面的例子我们每次%10, /=10,得到的是长数字10进制数的逆序数值。如果把10换成X,就能得到长数字X进制数的逆序数值。而这,正是10进制数字转化为n进制数字的计算机方法。