1.將一個非負的十進制整數N轉換成其他D進制數。
解決思路,連續取模%和整除/。D進制各數位的產生順序是從低位到高位,而輸出順序卻是從高位到低位,剛好相反,可以考慮使用棧進行逆序輸出。
public static string DecConvert(int N,int D)
{
if (D < 2 || D > 16)
{
throw new ArgumentOutOfRangeException("二進制至十六進制之間轉換");
}
Stack<char> stack = new Stack<char>();
do
{
int res = N % D;
char c = (res < 10) ? (char)(res + 48) : (char)(res + 55);
stack.Push(c);
}
while ((N = N / D) != 0);//爲0的時候,除到最後一位了
string s = string.Empty;
while (stack.Count > 0)
{
s += stack.Pop().ToString();
}
return s;
}
算法中十進制0和字符0 差48,在轉換的過程中要加上48.
字母A 爲65,比十大55,如下圖所示:
測試結果:
Console.WriteLine(StackApplication.DecConvert(13245,16)); Console.WriteLine(StackApplication.DecConvert(1238, 8));
Console.WriteLine(StackApplication.DecConvert(2263, 2));
Console.ReadKey();
2.楊輝三角問題
我們觀察可知,該三角除了每一行的第一個元素和最後一個元素是1,其他元素的值是上一行與之相鄰的兩個元素之和。
算法思路:首先將要打印的數據依次進隊,然後在打印每行除兩端數據時,依據出隊元素計算得出。
Queue<int> que = new Queue<int>();
int left=0, right = 0;
Console.Write("請輸入行數");
int n = int.Parse(Console.ReadLine());
for (int i = 0; i < n; i++)
{
for (int j = 1; j < n - i; j++)
{
//輸出各行的空格數
Console.Write(" ");
}
//每行有i+1 個元素
for (int k = 0; k <= i; k++)
{
int num = 1;
if (k != i)
{
right = (int)que.Dequeue();
if (k != 0)
{
num = left + right;
}
left = right;
}
//右對齊,四個長度
Console.Write(string.Format("{0,-4}", num.ToString()));
que.Enqueue(num);
}
Console.WriteLine();
}
3.迴文判斷,正讀和反讀都相同的字符序列,如abba,abcba。設計一個算法判斷輸入的字符序列 是否爲迴文。
思路:利用隊列和棧的特性,一個是先進先出,一個是先進後出
Console.Write("請輸入一個字符序列:");
string str = Console.ReadLine();
Queue<char> Que = new Queue<char>();
Stack<char> Sta = new Stack<char>();
for (int i = 0; i < str.Length; i++)
{
Que.Enqueue(str[i]);
Sta.Push(str[i]);
}
if (str.Length > 1)
{
if (Que.Dequeue()==Sta.Pop())
{
Console.WriteLine("您輸入的是迴文");
}
else
{
Console.WriteLine("您輸入的不是迴文");
}
}
else
{
Console.WriteLine("請正確輸入...");
}