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 <<"請輸入一個整數:\n";
  8. std::cin >>NumIn;//獲取整數輸入
  9. std::cin.ignore(100,'\n');//丟棄換行符。
  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<<"\n\n";
  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/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM