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。
具体代码如下,基本上每一行都有注释哟~
- #include<iostream>//输入输出流,cin、cout等函数在此头文件里;
- #include<string>//字符串头文件,字符串相关函数在此头文件里;
- #include<cstdlib>//C标准函数库。itoa()函数和system()函数都存在于这个头文件里。
- int main()
- {
- intNumIn;
- std::cout <<"请输入一个整数:\n";
- std::cin >>NumIn;//获取整数输入
- std::cin.ignore(100,'\n');//丢弃换行符。
- charTempChar[10];//创建临时数组用于存放字符串元素。因int的取值范围为2^32,
- //故10个元素足矣。
- std::stringNumStr;//定义字符串,用来存放数字。
- NumStr= itoa(NumIn,TempChar,10);//数字转字符串。并赋给NumStr。
- unsignedshortStrSize=NumStr.size();//获取字符串长度并赋给StrSize。
- unsignedshort i =1;//定义计数变量,用于下面的for循环。
- std::stringNumReverseStr;//定义字符串,用来存放逆序数。
- if(NumIn<0)//判断整型是否为负。负数如果直接转换成字符串再从后往前取子字符
- //串,会导致负号显示在最后,所以需要对负数进行特殊处理。
- {
- NumReverseStr+="-";
- for(i =0; i <=StrSize-2; i++)
- //从i = 0开始,到i = StrSize - 2结束,执行循环。
- //因为第一个元素为负号,所以只需要从后往前取到第二个(StrSize - 2)。
- {
- NumReverseStr+=NumStr.substr(StrSize-1- i,1);
- //取子字符串函数,从后往前取,每次取1个元素,然后加到逆序数字符串
- //NumReverseStr上。字符串可加,后面的字符串接到前面字符串的后面。
- }
- }
- else//当整型不小于0时,即可直接取。
- {
- for(i =0; i <=StrSize-1; i++)
- //从i = 0开始,到i = StrSize - 1结束,执行循环。
- //这里没有负号,因此可以将所有元素取完。
- {
- NumReverseStr+=NumStr.substr(StrSize-1- i,1);//注释见上
- }//循环结束
- }
- std::cout <<"您输入的数字的逆序输出是:"<<NumReverseStr<<"\n\n";
- system("pause");//暂停函数,防止代码执行完之后直接退出。
- return0;
- }
以上即完整代码,大家可以编译执行一下。
代码发给女神之后,没两天,女神发回来她一同学写的,说比我这简短得多……我一看,确实简短得多……而且写这码的是男的,瞬间让我……
他是用数学方法做的,代码如下解释都写在注释里面了:
- #include<iostream>
- int main()
- {
- int x,a,b;
- std::cout <<"请输入一个正整数:";
- std::cin >> x;
- a = x %10;//用x除以10取余数,比如123 % 10 = 3,即123除以10余3,将3赋给a
- //作为逆序第一位。
- do
- {
- b = x /10%10;
- //因为x、b是整数,所以b除以10之后得到的仍是整数。
- //以123为例,123 / 10 = 12;在C++里是这样计算的。
- //得到12之后,除以10取余,如12 % 10 = 2,将2赋给b。
- a = a *10+ b;
- //将开始得到的a乘以10再加上b,此时a = 3 * 10 + 2 = 32;
- x = x /10;
- //x除以10得到一整数,第一次循环即得到12,然后重新进行循环。
- }
- while(x /10!=0);
- std::cout<<"输入数的倒置为:"<< a << std::endl;
- return0;
- }
他这段是用数学方法写的,看了之后我瞬间觉得我的码弱爆了……我那50行代码就被这压缩压缩不超过10行的代码给秒掉了……他这俨然是初中数学的方法,想来我从初中开始数学就不给力了……这教育我们,数学一定要学好,不然连妹子都没得泡……
好吧言归正传。我那段代码是依赖于函数的,而且对数学不好的同学来说非常好理解,又很容易写出来。
而他那段代码是用数学方法写出来的,非常简短,动动脑筋就可以省下很多功夫……
不过,由于C++在Windows下的取值范围只是从-2147483648~2147483647,顶多有10位,超出范围的时候就会显示不正确,因而也就无法用于计算;此时,用字符串的方法就有绝对的优势了。而且稍微改一下,就能用于任意字符的逆序。因此尽管代码较多,而且可能速度略慢,还是有其存在意义的。
至于任意字符串的反序,部分代码如下,有需要的同学请自己改一改吧,我实在懒了:
- unsignedshortStrSize=StrIn.size();//获取字符串长度(.size()函数)。
- stringStrReverse;
- unsignedshort i =0;
- for(i =0; i <=StrSize-1; i++)
- {
- StrReverse+=StrIn.substr(StrSize-1- i,1);
- }
C++关于数字逆序输出的两种思路,及字符串逆序输出的更多相关文章
- php 冒泡排序的两种思路以及优化
php冒泡排序,两种思路,时间复杂度都是O(n^2),当然最优的时间复杂度就是O(n),以下说的都是正序排列(倒序的话,把内层循环的大于号换成小于号就好了) 第一种冒泡排序 思路就是把第一个数跟所有的 ...
- 把JSON数据载入到页面表单的两种思路(对easyui自带方法进行改进)
#把JSON数据载入到页面表单的两种思路(对easyui自带方法进行改进) ##背景 项目中经常需要把JSON数据填充到页面表单,一开始我使用easyui自带的form load方法,觉得效率很低,经 ...
- Java实现快排+小坑+partition的两种思路
在做一道剑指Offer的题的时候,有道题涉及到快排的思路,一开始就很快根据以前的思路写出了代码,但似乎有些细节不太对劲,自己拿数据试了下果然.然后折腾了下并记录下一些小坑,还有总结下划分方法parti ...
- 点击页面div弹窗以外隐藏的两种思路
在本文为大家介绍两种思路实现点击页面其它地方隐藏该div,第一种是对document的click事件绑定事件处理程序.. 第一种思路分两步 第一步:对document的click事件绑定事件处理程序, ...
- 使用 CUDA 进行计算优化的两种思路
前言 本文讨论如何使用 CUDA 对代码进行并行优化,并给出不同并行思路对均值滤波的实现. 并行优化的两种思路 思路1: global 函数 在 global 函数中创建出多个块多个线程对矩阵每个元素 ...
- 第七篇:使用 CUDA 进行计算优化的两种思路
前言 本文讨论如何使用 CUDA 对代码进行并行优化,并给出不同并行思路对均值滤波的实现. 并行优化的两种思路 思路1: global 函数 在 global 函数中创建出多个块多个线程对矩阵每个元素 ...
- 密码等级:至少包含字母、大小写数字、字符中的两种 JS实现方案
前言 密码,如果设置的太简单,很容易就被攻破,所以很多网站将密码设置的要求设置的挺严格,一般是字母.数字.字符3选2,区分大小写.对于设置得太简单的密码,予以错误提示.或者予以密码等级(低中高)显示, ...
- 微软BI 之SSIS 系列 - 两种将 SQL Server 数据库数据输出成 XML 文件的方法
开篇介绍 在 SSIS 中并没有直接提供从数据源到 XML 的转换输出,Destination 的输出对象有 Excel File, Flat File, Database 等,但是并没有直接提供 X ...
- [正经分析] DAG上dp两种做法的区别——拓扑序与SPFA
在下最近刷了几道DAG图上dp的题目. 要提到的第一道是NOIP原题<最优贸易>.这是一个缩点后带点权的DAG上dp,它同时规定了起点和终点. 第二道是洛谷上的NOI导刊题目<最长路 ...
随机推荐
- Android清除缓存功能来实现
我们都知道在Android的设置->应用程序中能够查看应用程序的相关信息,当中有一个功能是清除缓存. 如图: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZ ...
- 在 Windows Server 2008 R2 上安装 IIS 7.5
原文 在 Windows Server 2008 R2 上安装 IIS 7.5 默认情况下,Windows Server(R) 2008 R2 上不安装 IIS 7.5.可以使用服务器管理器中的“添加 ...
- ANDROID定义自己的看法——onMeasure,MeasureSpec源代码 过程 思考具体解释
一个简短的引论: 在他们的定义view什么时候,其实很easy,只需要知道3: 1.測量--onMeasure():决定View的大小 2.布局--onLayout():决定View在ViewGrou ...
- 他们控制的定义--让背景颜色变化ViewPager逐步幻灯片
转载请注明出处.谢谢~ 今天想说一个简单但很好的效果达到.代码是绝对简单,达到绝对easy,就是你可能想不到而已. 不多说,上效果图. 第一个效果是仿最美应用的滑动颜色变化,第二个是我项目中要用的效果 ...
- Date、DateTime值的格式化扩展函数
public static class DateTimeExtensions { public static DateTime ToUtc(this DateTime time) ...
- android控制文件:ViewPager+Fragment+GridView使用(与AndroidQuery框架结合)
最近我看到一个AndroidQuery该框架.里面Demo,有一个屏幕,让博主喜欢.很顺利的左右滑动,感觉非常好,所以拿来和大家分享一下.看看结果图.: 从图中能够看出.上面的布局是一个Layout里 ...
- 基于Servlet、JSP、JDBC、MySQL登录模块(包括使用的过滤器和配置)
遇见前文的注冊模块,本篇是登录模块.主要包含登录主界面,和登录相关编写的LoginAction.LoginDao和LoginService.以及配置的Filter.以下按逻辑顺序记录具体过程和代码: ...
- eclipese with gdbserver and Jlink configuration
最近的项目,很感动于linux和gdbserver内容,I think must write something to record it . 各位对不起,图片挂了.. Ok, at first I' ...
- 浅谈 js 语句块与标签
原文:浅谈 js 语句块与标签 语句块是什么?其实就是用 {} 包裹的一些js代码而已,当然语句块不能独立作用域.可以详细参见这里<MDN block> 也许很多人第一印象 {} 不是对象 ...
- 关于Java的对象、数组、String类的具体用法
对象的行为: 1.内存分配(栈和堆的区别) 栈:保存局部变量的值(用来保存基本数据类型的值:保存类的实例的引用) 对:用来存放动态产生的数据,比如new出来的对象 2.调用方法 方法返回一个值.方法不 ...