zoukankan      html  css  js  c++  java
  • C++关于数字逆序输出的两种思路,及字符串逆序输出

      最近在跟女神一起学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. #include<string>//字符串头文件,字符串相关函数在此头文件里;
    3. #include<cstdlib>//C标准函数库。itoa()函数和system()函数都存在于这个头文件里。
    4. int main()
    5. {
    6. intNumIn;
    7. std::cout <<"请输入一个整数: ";
    8. std::cin >>NumIn;//获取整数输入
    9. std::cin.ignore(100,' ');//丢弃换行符。
    10. charTempChar[10];//创建临时数组用于存放字符串元素。因int的取值范围为2^32,
    11. //故10个元素足矣。
    12. std::stringNumStr;//定义字符串,用来存放数字。
    13. NumStr= itoa(NumIn,TempChar,10);//数字转字符串。并赋给NumStr。
    14. unsignedshortStrSize=NumStr.size();//获取字符串长度并赋给StrSize。
    15. unsignedshort i =1;//定义计数变量,用于下面的for循环。
    16. std::stringNumReverseStr;//定义字符串,用来存放逆序数。
    17. if(NumIn<0)//判断整型是否为负。负数如果直接转换成字符串再从后往前取子字符
    18. //串,会导致负号显示在最后,所以需要对负数进行特殊处理。
    19. {
    20. NumReverseStr+="-";
    21. for(i =0; i <=StrSize-2; i++)
    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. else//当整型不小于0时,即可直接取。
    31. {
    32. for(i =0; i <=StrSize-1; i++)
    33. //从i = 0开始,到i = StrSize - 1结束,执行循环。
    34. //这里没有负号,因此可以将所有元素取完。
    35. {
    36. NumReverseStr+=NumStr.substr(StrSize-1- i,1);//注释见上
    37. }//循环结束
    38. }
    39. std::cout <<"您输入的数字的逆序输出是:"<<NumReverseStr<<" ";
    40. system("pause");//暂停函数,防止代码执行完之后直接退出。
    41. return0;
    42. }

    以上即完整代码,大家可以编译执行一下。

    代码发给女神之后,没两天,女神发回来她一同学写的,说比我这简短得多……我一看,确实简短得多……而且写这码的是男的,瞬间让我……

    他是用数学方法做的,代码如下解释都写在注释里面了:


    1. #include<iostream>
    2. int main()
    3. {
    4. int x,a,b;
    5. std::cout <<"请输入一个正整数:";
    6. std::cin >> x;
    7. a = x %10;//用x除以10取余数,比如123 % 10 = 3,即123除以10余3,将3赋给a
    8. //作为逆序第一位。
    9. do
    10. {
    11. b = x /10%10;
    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. x = x /10;
    18. //x除以10得到一整数,第一次循环即得到12,然后重新进行循环。
    19. }
    20. while(x /10!=0);
    21. std::cout<<"输入数的倒置为:"<< a << std::endl;
    22. return0;
    23. }

      他这段是用数学方法写的,看了之后我瞬间觉得我的码弱爆了……我那50行代码就被这压缩压缩不超过10行的代码给秒掉了……他这俨然是初中数学的方法,想来我从初中开始数学就不给力了……这教育我们,数学一定要学好,不然连妹子都没得泡……

    好吧言归正传。我那段代码是依赖于函数的,而且对数学不好的同学来说非常好理解,又很容易写出来。

    而他那段代码是用数学方法写出来的,非常简短,动动脑筋就可以省下很多功夫……

          不过,由于C++在Windows下的取值范围只是从-2147483648~2147483647,顶多有10位,超出范围的时候就会显示不正确,因而也就无法用于计算;此时,用字符串的方法就有绝对的优势了。而且稍微改一下,就能用于任意字符的逆序。因此尽管代码较多,而且可能速度略慢,还是有其存在意义的。

    至于任意字符串的反序,部分代码如下,有需要的同学请自己改一改吧,我实在懒了:


    1. unsignedshortStrSize=StrIn.size();//获取字符串长度(.size()函数)。
    2. stringStrReverse;
    3. unsignedshort i =0;
    4. for(i =0; i <=StrSize-1; i++)
    5. {
    6. StrReverse+=StrIn.substr(StrSize-1- i,1);
    7. }

    转载 http://www.avdir.com/programming/C--shuzinixushuchu/

  • 相关阅读:
    常见问题
    查询
    多对多关系
    prototype & __proto__
    new operator
    用户
    express.Router
    Express 应用生成器
    LeanCloud
    npm常用命令
  • 原文地址:https://www.cnblogs.com/zhuzhudexiaoshijie/p/3328403.html
Copyright © 2011-2022 走看看