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);
- }