C++关于数字逆序输出的两种思路,及字符串逆序输出
C++關于數(shù)字逆序輸出的兩種思路,及字符串逆序輸出
作者:GREATCOFFEE發(fā)布時間:NOVEMBER 15, 2012分類:編程的藝術
最近在跟女神一起學C++(其實我是不懷好意),然后女神有個作業(yè)求助,要求輸入一個數(shù)字,然后程序將數(shù)字逆序輸出。這機會必須把握的啊,于是咱就毅然接下了這個任務。
其實那個時候還不會,于是就去百度了……不得不說,別人寫的碼質(zhì)量參差不齊啊,沒一個我能看上的,于是那天晚上就通宵看書(《寫給大家看的C++書》[美]Larry Ullman & Andreas Signer著/楊濤&王建橋&楊曉云等譯,推薦),隨手翻到第12章,發(fā)現(xiàn)有.substr()這個函數(shù),于是果斷采取如下思路:
1、將整型(int)用itoa()函數(shù)轉化為字符串(string);
2、利用.substr()函數(shù)將字符串每次取1個單位長度,從后往前取,將這些子字符串加到新空字符上;
3、(可選)將字符串用atoi()函數(shù)重新轉化為整型。
這樣基本上用到了2(或者3)個函數(shù):itoa()和.substr。這兩個函數(shù)的用法如下:
itoa():itoa(IntIn, TempChar, scale);
IntIn:需要轉換的整型;
TempChar:用于放置每一位數(shù)字的臨時字符數(shù)組;
scale:進位制,如10即10進制。
.substr():ParentStr.substr(Position, units);
ParentStr:需要取子字符串的字符串;
Position:取字符串開始的位置,如第一位為0,第二位位1;
units:取的位數(shù),取一位即1。
具體代碼如下,基本上每一行都有注釋喲~
#include<iostream>//輸入輸出流,cin、cout等函數(shù)在此頭文件里;
#include<string>//字符串頭文件,字符串相關函數(shù)在此頭文件里;
#include<cstdlib>//C標準函數(shù)庫。itoa()函數(shù)和system()函數(shù)都存在于這個頭文件里。
int main()
{
intNumIn;
std::cout <<"請輸入一個整數(shù):
";
std::cin >>NumIn;//獲取整數(shù)輸入
std::cin.ignore(100,'
');//丟棄換行符。
charTempChar[10];//創(chuàng)建臨時數(shù)組用于存放字符串元素。因int的取值范圍為2^32,
//故10個元素足矣。
std::stringNumStr;//定義字符串,用來存放數(shù)字。
NumStr= itoa(NumIn,TempChar,10);//數(shù)字轉字符串。并賦給NumStr。
unsignedshortStrSize=NumStr.size();//獲取字符串長度并賦給StrSize。
unsignedshort i =1;//定義計數(shù)變量,用于下面的for循環(huán)。
std::stringNumReverseStr;//定義字符串,用來存放逆序數(shù)。
if(NumIn<0)//判斷整型是否為負。負數(shù)如果直接轉換成字符串再從后往前取子字符
//串,會導致負號顯示在最后,所以需要對負數(shù)進行特殊處理。
{
NumReverseStr+="-";
for(i =0; i <=StrSize-2; i++)
//從i = 0開始,到i = StrSize - 2結束,執(zhí)行循環(huán)。
//因為第一個元素為負號,所以只需要從后往前取到第二個(StrSize - 2)。
{
NumReverseStr+=NumStr.substr(StrSize-1- i,1);
//取子字符串函數(shù),從后往前取,每次取1個元素,然后加到逆序數(shù)字符串
//NumReverseStr上。字符串可加,后面的字符串接到前面字符串的后面。
}
}
else//當整型不小于0時,即可直接取。
{
for(i =0; i <=StrSize-1; i++)
//從i = 0開始,到i = StrSize - 1結束,執(zhí)行循環(huán)。
//這里沒有負號,因此可以將所有元素取完。
{
NumReverseStr+=NumStr.substr(StrSize-1- i,1);//注釋見上
}//循環(huán)結束
}
std::cout <<"您輸入的數(shù)字的逆序輸出是:"<<NumReverseStr<<"
";
system("pause");//暫停函數(shù),防止代碼執(zhí)行完之后直接退出。
return0;
}
以上即完整代碼,大家可以編譯執(zhí)行一下。
代碼發(fā)給女神之后,沒兩天,女神發(fā)回來她一同學寫的,說比我這簡短得多……我一看,確實簡短得多……而且寫這碼的是男的,瞬間讓我……
他是用數(shù)學方法做的,代碼如下解釋都寫在注釋里面了:
#include<iostream>
int main()
{
int x,a,b;
std::cout <<"請輸入一個正整數(shù):";
std::cin >> x;
a = x %10;//用x除以10取余數(shù),比如123 % 10 = 3,即123除以10余3,將3賦給a
//作為逆序第一位。
do
{
b = x /10%10;
//因為x、b是整數(shù),所以b除以10之后得到的仍是整數(shù)。
//以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得到一整數(shù),第一次循環(huán)即得到12,然后重新進行循環(huán)。
}
while(x /10!=0);
std::cout<<"輸入數(shù)的倒置為:"<< a << std::endl;
return0;
}
他這段是用數(shù)學方法寫的,看了之后我瞬間覺得我的碼弱爆了……我那50行代碼就被這壓縮壓縮不超過10行的代碼給秒掉了……他這儼然是初中數(shù)學的方法,想來我從初中開始數(shù)學就不給力了……這教育我們,數(shù)學一定要學好,不然連妹子都沒得泡……
好吧言歸正傳。我那段代碼是依賴于函數(shù)的,而且對數(shù)學不好的同學來說非常好理解,又很容易寫出來。
而他那段代碼是用數(shù)學方法寫出來的,非常簡短,動動腦筋就可以省下很多功夫……
不過,由于C++在Windows下的取值范圍只是從-2147483648~2147483647,頂多有10位,超出范圍的時候就會顯示不正確,因而也就無法用于計算;此時,用字符串的方法就有絕對的優(yōu)勢了。而且稍微改一下,就能用于任意字符的逆序。因此盡管代碼較多,而且可能速度略慢,還是有其存在意義的。
至于任意字符串的反序,部分代碼如下,有需要的同學請自己改一改吧,我實在懶了:
unsignedshortStrSize=StrIn.size();//獲取字符串長度(.size()函數(shù))。
stringStrReverse;
unsignedshort i =0;
for(i =0; i <=StrSize-1; i++)
{
StrReverse+=StrIn.substr(StrSize-1- i,1);
}
轉載 http://www.avdir.com/programming/C--shuzinixushuchu/
總結
以上是生活随笔為你收集整理的C++关于数字逆序输出的两种思路,及字符串逆序输出的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: height:auto 火狐没边框
- 下一篇: 怎样创建XML文档