level 1
首先,只看这个题本身的话,我的第一反应是这种思路:循环除以10取余,并拼接余数,最后输出拼接结果,代码如下:
Do While N > 0
t = N Mod 10
s = s * 10 + t
N = N \ 10
Loop
Print s
但是继续看下面的提问和拓展……
提问一:如何去除末尾的零?
呃……不需要啊?
提问二:如何反转?从左取数字还是从右取数字?
嗯……这种思路只能从右取数字,这个问题也不成问题啊
拓展一:上面这个程序不能处理负数,如何改进?
简单,把循环条件从 N > 0 改成 N <> 0 即可
拓展二:上面用的是“取数字后直接打印”,也可以反转拼接后再打印
这就尴尬了
那好,再按照“取数字后直接打印”的思路写个代码:
'去除末尾的零(没错,这就有必要了)
Do While N Mod 10 = 0 And N <> 0
'这里的 N <> 0 是个容错处理,因为0除以10的余数也是0,如果输入了0而不进行排除,
'会造成死循环(前面的思路就没这个问题)
N = N \ 10
Loop
'反转打印
Do While N > 0 '此时这个条件写成 N <> 0 也可以,但是这个思路天生不能处理负数;
'不过有办法,一会再说
Print CStr(N Mod 10);
N = N \ 10
Loop
好了,再看提问和拓展:
提问一:如何去除末尾的零?
在开始输出之前,先用一个循环,当除以10的余数为0时,不输出余数,只除以10,这样就去掉0了
提问二:如何反转?从左取数字还是从右取数字?
这个其实“取数字”的核心算法没变,还是“除10取余”,所以仍然只能从右取数字,这个问题仍然不成问题
拓展一:上面这个程序不能处理负数,如何改进?
在“反转打印”之前,先判断数字的正负,如果是负数,则先输出一个负号,然后变成正数,即可正常继续,代码如下:
If N < 0 Then
Print "-";
N = -N
End If
拓展二:……这就不用说了
另外,刚才一直都在说“提问二”的问题其实不成问题,那什么情况下它会成问题呢?
还有,关于“反转拼接后再打印”这种思路,拼接用的变量也可以换成字符串类型,此时就不像用数值型那样可以不必考虑末尾0的问题了,同样需要去掉0;或者倒不如说,如果反过来“不希望去掉末尾的0”,并且还想用变量保存拼接结果,那么字符串型是必然的选择(否则就需要上数组了)
不过,后面这些的代码我都不打算写了……

