強行刷段位第三天
好快呀,都第三天了。
話不多說,刷題。
進位制轉換第一題:
題目:
將十進位制數n轉換成m進位制數 m<=16
n<=100
輸入描述:
共一行
n和m
輸出描述:
共一個數
表示n的m進位制
樣例輸入:
樣例1:10 2
樣例2:100 15
樣例輸出:
樣例1:1010
樣例2:6A
資料範圍及提示:
用反向取餘法
我的答案:
發現進入白銀之後就是系統的刷題了,各種型別的基礎題都來兩道。
這種感覺很好,系統而有趣味。
一種型別兩道,一天一個型別。有餘力(變身烏龜的時候)的話可以再做一個型別。進度不緊不慢剛剛好。
這麼看起來離黃金也不是那麼的遠了。
本題用到了除k取餘法。要注意凡是大於9的數字都要用ABC什麼的代替,萬萬不能搞一個兩位數在那明晃晃的掛著。
自己總是在語法細節上遺忘,要記住本題的方式。
char arr[8];
if(n<10) arr[top]='0'+n;
else arr[top]='A'+n-10;
要注意:1.C語言中,字元的儲存就是按其ASCII值(整數)進行儲存的
2.用單引號取出其ASCII碼,不加單引號自動輸出ASCII對應的字元
程式碼如下:
#include <iostream> using namespace std; int main() { int n,m; cin>>n>>m; char arr[8]; int top=-1; int temp=0; while(n!=0) { temp=n/m; top++; if(n%m<10) arr[top]='0'+n%m; else arr[top]='A'+n%m-10; n=temp; } while(top>=0) { cout<<arr[top]; top--; } return 0; }
進位制轉換第二題:
問題:
將m進位制數n轉化成一個十進位制數 m<=16
題目保證轉換後的十進位制數<=100
輸入描述:
共一行
n和m
輸出描述:
共一個數
表示m進位制的n化成十進位制的數
樣例輸入:
1010 2
樣例輸出:
10
資料範圍及提示:
乘權累加法
我的答案:
這題看似只是上一題的反過程,其實要比上一題複雜一些。在累乘過程中要慎重。行數也不多,20行足夠完成。
這題學到的同樣是語法問題。
1.以前上課那會兒字串和陣列就學的不紮實。字串本質和char型別的陣列是相同的,所以字串也是可以用n[3]來表示字串中第四個字元的。
2.另外,可以include<string.h>,利用strlen()來獲得字串長度,方便接下來的迴圈條件的書寫。
程式碼如下:
#include <iostream>
#include <string.h>
using namespace std;
int main()
{
int m;
char n[8];
cin>>n>>m;
int len=strlen(n);
int res=0;
for(int i=0;i<len;i++)
{
if(n[i]>='0' && n[i]<='9')
res=res*m+n[i]-'0';
else if(n[i]>='A' && n[i]<='F')
res=res*m+n[i]-'A'+10;
}
cout<<res;
return 0;
}
還剩一個遞推,一個遞迴。
遞迴的兩道題感覺不是很難。遞迴的題目有5道,正好我的遞迴不熟練,可以好好練。裡面有很多經典的問題,包括樹和漢諾塔等等。
感覺再有個三天就能完成白銀Silver啦。
希望早點升黃金Gold。