C++关于数字逆序输出的两种思路,及字符串逆序输出
C++关于数字逆序输出的两种思路,及字符串逆序输出
作者:GREATCOFFEE 发布时间:NOVEMBER 15, 2012 分类:
  最近在跟⼥神⼀起学C++(其实我是不怀好意),然后⼥神有个作业求助,要求输⼊⼀个数字,然后程序将数字逆序输出。这机会必须把握的啊,于是咱就毅然接下了这个任务。
  其实那个时候还不会,于是就去百度了……不得不说,别⼈写的码质量参差不齐啊,没⼀个我能看上的,于是那天晚上就通宵看书(《写给⼤家看的C++书》[美]Larry Ullman & Andreas Signer著/杨涛&王建桥&杨晓云等译,推荐),随⼿翻到第12章,发现有.substr()这个函数,于是果断采取如下思路:
1、将整型(int)⽤itoa()函数转化为字符串(string);
2、利⽤.substr()函数将字符串每次取1个单位长度,从后往前取,将这些⼦字符串加到新空字符上;
3、(可选)将字符串⽤atoi()函数重新转化为整型。
这样基本上⽤到了2(或者3)个函数:itoa()和.substr。这两个函数的⽤法如下:
itoa():itoa(IntIn, TempChar, scale);
      IntIn:需要转换的整型;
    TempChar:⽤于放置每⼀位数字的临时字符数组;
字符串长度超出定义值    scale:进位制,如10即10进制。
.substr():ParentStr.substr(Position, units);
ParentStr:需要取⼦字符串的字符串;
Position:取字符串开始的位置,如第⼀位为0,第⼆位位1;
units:取的位数,取⼀位即1。
具体代码如下,基本上每⼀⾏都有注释哟~
1. #include<iostream>//输⼊输出流,cin、cout等函数在此头⽂件⾥;
2. //字符串头⽂件,字符串相关函数在此头⽂件⾥;
3. //C标准函数库。itoa()函数和system()函数都存在于这个头⽂件⾥。
4.
5. {
6.
7. "请输⼊⼀个整数:\n"
8. std::cin >>NumIn;//获取整数输⼊
9. 100//丢弃换⾏符。
10. 10//创建临时数组⽤于存放字符串元素。因int的取值范围为2^32,
11. //故10个元素⾜矣。
12. //定义字符串,⽤来存放数字。
13. 10//数字转字符串。并赋给NumStr。
14. //获取字符串长度并赋给StrSize。
15. unsigned short i =1;//定义计数变量,⽤于下⾯的for循环。
16. //定义字符串,⽤来存放逆序数。
17. 0//判断整型是否为负。负数如果直接转换成字符串再从后往前取⼦字符
18. //串,会导致负号显⽰在最后,所以需要对负数进⾏特殊处理。
19.
20.
21. 02
22. //从i = 0开始,到i = StrSize - 2结束,执⾏循环。
23. //因为第⼀个元素为负号,所以只需要从后往前取到第⼆个(StrSize - 2)。
24.
25. NumReverseStr+=NumStr.substr(StrSize-1- i,1);
26. //取⼦字符串函数,从后往前取,每次取1个元素,然后加到逆序数字符串
27. //NumReverseStr上。字符串可加,后⾯的字符串接到前⾯字符串的后⾯。
28.
29.
30. //当整型不⼩于0时,即可直接取。
31.
32. for(i =0; i <=StrSize-1; i++)
33. //从i = 0开始,到i = StrSize - 1结束,执⾏循环。
34. //这⾥没有负号,因此可以将所有元素取完。
35. {
36. 11//注释见上
37. //循环结束
38.
39. "您输⼊的数字的逆序输出是:"
40. //暂停函数,防⽌代码执⾏完之后直接退出。
41. 0
42. }
以上即完整代码,⼤家可以编译执⾏⼀下。
代码发给⼥神之后,没两天,⼥神发回来她⼀同学写的,说⽐我这简短得多……我⼀看,确实简短得多……⽽且写这码的是男的,瞬间让我……
他是⽤数学⽅法做的,代码如下解释都写在注释⾥⾯了:
1.
2.
3.
4.
5. std::cout <<"请输⼊⼀个正整数:";
6.
7. 10//⽤x除以10取余数,⽐如123 % 10 = 3,即123除以10余3,将3赋给a
8. //作为逆序第⼀位。
9.
10.
11. 1010
12. //因为x、b是整数,所以b除以10之后得到的仍是整数。
13. //以123为例,123 / 10 = 12;在C++⾥是这样计算的。
14. //得到12之后,除以10取余,如12 % 10 = 2,将2赋给b。
15.    a = a *10+ b;
16. //将开始得到的a乘以10再加上b,此时a = 3 * 10 + 2 = 32;
17. 10
18. //x除以10得到⼀整数,第⼀次循环即得到12,然后重新进⾏循环。
19.
20. 100
21. "输⼊数的倒置为:"
22. 0
23.
  他这段是⽤数学⽅法写的,看了之后我瞬间觉得我的码弱爆了……我那50⾏代码就被这压缩压缩不超过10⾏的代码给秒掉了……他这俨然是初中数学的⽅法,想来我从初中开始数学就不给⼒了……这教育我们,数学⼀定要学好,不然连妹⼦都没得泡……
好吧⾔归正传。我那段代码是依赖于函数的,⽽且对数学不好的同学来说⾮常好理解,⼜很容易写出来。
⽽他那段代码是⽤数学⽅法写出来的,⾮常简短,动动脑筋就可以省下很多功夫……
不过,由于C++在Windows下的取值范围只是从-2147483648~2147483647,顶多有10位,超出范围的时候就会显⽰不正确,因⽽也就⽆法⽤于计算;此时,⽤字符串的⽅法就有绝对的优势了。⽽且稍微改⼀下,就能⽤于任意字符的逆序。因此尽管代码较多,⽽且可能速度略慢,还是有其存在意义的。
⾄于任意字符串的反序,部分代码如下,有需要的同学请⾃⼰改⼀改吧,我实在懒了:
1. //获取字符串长度(.size()函数)。
2.
3. unsigned short i =0;
4. 01
5.
6. StrReverse+=StrIn.substr(StrSize-1- i,1);
7.

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。