一琉闪、漢諾塔
假設(shè)所有的盤子都在A柱迹炼,需要移動(dòng)到C柱。
輸入盤子的數(shù)量颠毙,輸出移動(dòng)的步驟斯入。
#include<iostream>
using namespace std;
void hanoi(int n, char a, char b, char c)
{
if(n != 1)
{
hanoi(n - 1, a, c, b);
cout<<"把一個(gè)盤子從"<<a<<"移到"<<c<<endl;
hanoi(n - 1, b, a, c);
}
else if(n == 1)
{
cout<<"把一個(gè)盤子從"<<a<<"移到"<<c<<endl;
}
}
int main()
{
int n;
char a = 'a', b = 'b', c = 'c';
cin>>n;
hanoi(n, a, b, c);
return 0;
}
二、放蘋果
把m個(gè)蘋果放到n個(gè)盤子里蛀蜜,可以有空盤子刻两。求有多少種算法?
例:
輸入:7 3
輸出:8
注:
不考慮盤子順序滴某,即1,5,1
和5,1,1
視作同一種放法
int apple(int m, int n)
{
int x, emptyExist = 0;
if( m == 1 && n == 1)
return 1;
else if(n > m)
{
return apple(m, m);
}
else if(m != 0 && n == 0)
return 0;
else if(m == 0)
return 1;
else if( n <= m)
{
return apple(m - n, n) + apple(m, n - 1);
}
} //在main函數(shù)里輸入m和n后磅摹,輸出apple(m, n)即可
三、求解理解錯(cuò)誤的逆波蘭表達(dá)式的值
寫程序之前壮池,理解錯(cuò)了逆波蘭表達(dá)式的概念偏瓤。
這一段里的逆波蘭表達(dá)式的計(jì)算方法為:
輸入一個(gè)待求解的逆波蘭表達(dá)式input:
float input[] = {'/', '+', '/', 11, 22, 24, 20};
如上input的計(jì)算方式為 :20 / (24 + (22 / 11))
這種解法貌似有點(diǎn)兒笨
思路:
代碼:
#include<stdio.h>
#include<math.h>
float compute(float before[], int sizebefore, float after[], int sizeafter);
float reverse(float a[], int l);
float input[] = {'/', '+', '/', 11, 22, 24, 20};
float output[] = {'+', 11, 12};
float reverse(float a[], int l)
{
int i;
float b[l - 2];
if(l == 3)
{
switch((int)a[0]) //a[2] 運(yùn)算符 a[1]
{
case '+':
return a[2] * 1.0 + a[1];
break;
case '-':
return a[2] * 1.0 - a[1];
break;
case '*':
return a[2] * 1.0 * a[1];
break;
case '/':
return a[2] * 1.0 / a[1];
break;
}
}
else
{
for(i = 1; i <= l - 2; i++)
{
b[i - 1] = a[i]; //b[] 為 a[] 除去頭和尾,即下一次遞歸的a[]
}
return compute(a, l, b, l - 2); //a[l - 2] * reverse(b[])
}
}
float compute(float before[], int sizebefore, float after[], int sizeafter)
{
switch((int)before[0])
{
case '+':
return before[sizebefore - 1] * 1.0 + reverse(after, sizeafter);
break;
case '-':
return before[sizebefore - 1] * 1.0 - reverse(after, sizeafter);
break;
case '*':
return before[sizebefore - 1] * 1.0 * reverse(after, sizeafter);
break;
case '/':
return before[sizebefore - 1] * 1.0 / reverse(after, sizeafter);
break;
}
}
int main()
{
float toBeSolved[];
int sizeOf; //自行輸入逆波蘭表達(dá)式椰憋,To be continued
printf("%f", reverse(input, sizeof(input) / sizeof(input[0])));
return 0;
}
四厅克、真·逆波蘭表達(dá)式
真·逆波蘭表達(dá)式的形式示意:
表達(dá)式:* / + 12 36 + 1 3 - 15 8
含義:((12 + 36) / (1 + 3)) * (15 - 8)
結(jié)果:84
思路:
定義一個(gè)返回表達(dá)式的值的函數(shù)。
輸入橙依,并將輸入作為字符串處理证舟。
若字符串第一個(gè)字符為運(yùn)算符+
,-
,*
,/
硕旗,則接下來輸入的肯定是連續(xù)兩個(gè)逆波蘭表達(dá)式,即再調(diào)用兩次此函數(shù)女责,且這兩個(gè)函數(shù)相加減乘除漆枚。
若字符串內(nèi)第一個(gè)字符為數(shù)字,則調(diào)用atof()
函數(shù)將數(shù)字轉(zhuǎn)換為浮點(diǎn)數(shù)作為返回值抵知。
注:若第一個(gè)字符為-
墙基,可能是遇到了負(fù)數(shù),因此需在此中情形里加入一個(gè)判斷刷喜,如果字符串長度strlen()
為1残制,則按運(yùn)算符處理,否則按數(shù)字處理掖疮。
代碼:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
float reverse()
{
char a[10];
scanf("%s", a);
switch(a[0])
{
case '+': return reverse() + reverse();
case '-': if(strlen(a) == 1) return reverse() - reverse();
else return atof(a);
case '*': return reverse() * reverse();
case '/': return reverse() / reverse();
default: return atof(a);
}
}
int main()
{
float a = reverse();
printf("%.2f", a);
return 0;
}