Universidad de Pekín C Aprendizaje de idiomas Día 12

Evaluación de cuatro expresiones aritméticas
Ejemplo: evaluación
de cuatro expresiones aritméticas La entrada es la expresión de cuatro expresiones aritméticas, que consta solo de enteros, +, -,
*
, /, (,)
, y no hay espacios. Suponga que los resultados del operador son todos enteros
. "/" El resultado es también un número entero
determinación forma recursiva recursiva de problemas
ideas de la solución:
la expresión se define en una recursiva:
Expresiones artículo
+
-
artículos
*
/
factor de
factor de
(expresión)
número entero
por lo que para el análisis de expresión se puede realizar de forma recursiva

#include <iostream>
#include <cstring>
#include <cstdlib>
using namespace std;
int factor_value();
int term_value();
int expression_value();
int main()
{
cout << expression_value() << endl;
return 0;
}
输入:(2+3)*(5+7)+9/3
输出: 63
int expression_value() //求一个表达式的值
{
int result = term_value(); //求第一项的值
bool more = true;
while( more) {
char op = cin.peek(); //看一个字符,不取走
if( op == '+' || op == '-' ) {
cin.get(); //从输入中取走一个字符
int value = term_value();
if( op == '+' ) result += value;
else result -= value;
}
else more = false;
}
return result;
}
int term_value() //求一个项的值
{
int result = factor_value(); //求第一个因子的值
while(true) {
char op = cin.peek();
if( op == '*' || op == '/') {
cin.get();
int value = factor_value();
if( op == '*') 
result *= value;
else result /= value;
}
else 
break;
}
return result;
}
int factor_value() //求一个因子的值
{
int result = 0;
char c = cin.peek();
if( c == '(') {
cin.get();
result = expression_value();
cin.get();
}
else {
while(isdigit(c)) {
result = 10 * result + c - '0';
cin.get();
c = cin.peek();
}
}
return result;
}

Ejemplo: subir escaleras
Resuelva el problema en subproblemas más pequeños para resolverlo
Ejemplo: subir las escaleras El
maestro sube las escaleras, puede caminar 1 o 2 pasos a la vez, ingrese el número de escaleras y
encuentre diferentes números de pasos
por ejemplo: Hay tres escaleras, podría haber ido todos los niveles, o por primera vez ir un
nivel, dos segundos a pie, se puede ir de dos por primera vez, para ir por segunda vez, un
total de 3 métodos
De entrada
de entrada contiene un número de filas, cada fila que contiene un número entero positivo de N, las escaleras serie representativa ,. 1
<= N <= 30 salidas, el número de movimientos diferentes, cada fila corresponde a una línea de entrada de
la escalera
de salida de
un número diferente de movimientos, cada línea de entrada Corresponde a una línea de salida
Entrada de muestra
5
8
10
Salida de muestra
8
34
89
Subir escaleras
n-pasos = caminar
primero un nivel, n-1 pasos +
dos pasos primero, n-2 pasos el pie
f (n) = f (n -1) + f (n-2)
condiciones de contorno:
escaleras
n = las escaleras a pie
después de una sola vez, n-1 + y las escaleras a pie
van Después de dos pasos, el método de caminar de n-2 pasos
f (n) = f (n-1) + f (n-2)
condición límite: n <0 0
n = 0 1
Subir escaleras
n pasos: caminar
después de un nivel primero, n-1 pasos caminar +
dos pasos primero, n-2 pasos
f (n) = f (n -1) + f (n-2)
condición límite: n <0 0 n = 0 1 n = 1 1
n = 0 1 n = 1 1 n = 2 2

#include <iostream>
using namespace std;
int N;
int stairs(int n)
{
if( n < 0)
return 0;
if( n == 0 )
return 1;
return stairs(n-1) + stairs(n-2);
}
int main()
{
while(cin >> N) {
cout << stairs(N) << endl;
}
return 0;
}

Ejemplo: poner manzanas
Ponga M manzanas idénticas en N platos iguales. Algunos platos se pueden dejar vacíos.
¿Cuántos puntos diferentes hay? 5,1,1 y 1,5,1 son el mismo método de división.
Entrada La
primera línea es el número de datos de prueba t (0 <= t <= 20). Cada línea a continuación contiene dos enteros
M y N, separados por espacios. 1 <= M, N <= 10.
Salida
Para cada conjunto de datos de entrada M y N, use una línea para generar la K. correspondiente
Ejemplo de entrada
1
7 3
Ejemplo de salida
8
preguntas de muestra: poner manzanas
Dejar que las manzanas se coloquen en k platos El número total de métodos es f (i, k), luego:
Ejemplo: poner manzanas
i poner manzanas en k platos El número total de métodos de colocación es f (i, k), entonces: cuando
k> i, f (i, k) = f (i, i)
Ejemplo: Ponga manzanas y
coloque i manzanas en las placas K. El número total de métodos de colocación es f (i, k), entonces: cuando
k> i, f (i, k) = f (i, i)
k <= i, el método put total = poner con plato vacío + vacío sin plato Poner método
f (i, k) = f (i, k-1) + f (ik, k)
condición límite?
Ejemplo: poner manzanas

#include <iostream>
using namespace std;
int f(int m,int n) {
if( n > m )
return f(m,m);
if( m == 0)
return 1;
if( n <= 0 )
return 0;
return f(m,n-1) + f(m-n,n);
}
int main() {
int t,m,n;
cin >> t;
while( t--) {
cin >> m >> n;
cout << f(m,n) << endl; 
}
return 0;
}

Ejemplo: cuenta 24

Dados 4 enteros positivos menores que 10, puede usar la suma, resta, multiplicación y división de 4 operaciones y paréntesis para
conectar estos 4 números para obtener una expresión. La pregunta ahora es si hay
una manera de hacer que el resultado de la expresión sea igual a 24.
La suma, resta, multiplicación y división, y los resultados de la operación y la prioridad de los corchetes son
consistentes con nuestras definiciones habituales (la definición de división aquí es división real).
Por ejemplo, para 5, 5, 5, 1, sabemos que 5 * (5 - 1/5) = 24, por lo que
podemos obtener 24. Como otro ejemplo, para 1, 1, 4, 2, nunca podemos obtener
24.
Ejemplo: contar 24
entradas Los
datos de entrada incluyen varias líneas, cada línea proporciona un conjunto de datos de prueba, que incluyen 4 menos de 10 enteros positivos
. El último conjunto de datos de prueba incluye 4 ceros, que indican el final de la entrada, y este conjunto de datos no necesita ser
procesado.
Salida
Para cada conjunto de datos de prueba, envíe una línea. Si 24 está disponible, envíe "SÍ"; de lo
contrario, envíe "NO".
Entrada de muestra
5 5 5 1
1 1 4 2
0 0 0 0
Salida de muestra

NO
Problema de ejemplo: Cuente 24
n números para calcular 24, debe haber dos números para calcular primero. Los resultados de estos dos números, y los números n-2 restantes,
constituyen el problema de encontrar 24 para los números n-1.
Enumere los dos números que se calculan primero y el método de cálculo de los dos números.
Condiciones de contorno
Nota: si las comparaciones de punto flotante son iguales, no puede usar ==
Ejemplo: Cuente 24
n números para calcular 24, debe haber dos números para calcular primero. Los resultados de estos dos números, y los números n-2 restantes,
constituyen el problema de encontrar 24 para los números n-1.
Enumere los dos números que se calculan primero y el método de cálculo de los dos números.
Condición límite: un número cuenta 24
Nota: La comparación de números de coma flotante es igual y no se puede usar ==
Ejemplo de problema: cuenta 24

#include <iostream>
#include <cmath>
using namespace std;
double a[5];
#define EPS 1e-6
bool isZero(double x) {
return fabs(x) <= EPS; 
}
bool count24(double a[],int n) 
{//用数组a里的 n个数,计算24
if( n == 1 ) {
if(isZero( a[0] - 24) )
return true;
else
return false;
}
double b[5];
for(int i = 0;i < n-1; ++i)
for(int j = i+1;j < n; ++j) { //枚举两个数的组合
int m = 0; //还剩下m个数, m = n - 2
for(int k = 0; k < n; ++k) 
if( k != i && k!= j)
b[m++] = a[k];//把其余数放入b
b[m] = a[i]+a[j];
if(count24(b,m+1))
return true;
b[m] = a[i]-a[j];
if(count24(b,m+1))
return true;
b[m] = a[j]-a[i];
if(count24(b,m+1))
return true;
b[m] = a[i]*a[j];
if(count24(b,m+1))
return true;
if( !isZero(a[j])) {
b[m] = a[i]/a[j];
if(count24(b,m+1))
return true;
}
if( !isZero(a[i])) {
b[m] = a[j]/a[i];
if(count24(b,m+1))
return true;
}
}
return false;
}
int main()
{
while(true) {
for(int i = 0;i < 4; ++i)
cin >> a[i];
if( isZero(a[0]))
break;
if( count24(a,4))
cout << "YES" << endl;
else
cout << "NO" << endl;
}
return 0;
}
193 artículos originales publicados · Me gusta 66 · Visitas 10,000+

Supongo que te gusta

Origin blog.csdn.net/qq_42403069/article/details/105549791
Recomendado
Clasificación