Aprendizaje de algoritmos de lenguaje C (puntero, estructura, cálculo matemático)

Este artículo comenzará con 7 preguntas de muestra y describirá mi aprendizaje sobre los algoritmos hoy

A - Calendario Maya

Reexpresión del problema

El fin de semana pasado, el profesor MA Ya hizo un gran descubrimiento sobre los antiguos mayas. A partir de una antigua cuerda de nudo (una herramienta utilizada por los mayas para registrar cosas), el profesor descubrió que los mayas usaban el calendario Haab, que tiene 365 días en un año. El calendario Haab tiene 19 meses por año. En los primeros 18 meses, hay 20 días en cada mes. Los nombres de los meses son pop, no, zip, zotz, tzec, xul, yoxkin, mol, chen, yax, zac , ceh, mac, kankin, muan, pax, koyab, cumhu. Las fechas en estos meses están representadas por 0 a 19; el último mes del calendario Haab se llama uayet, que tiene solo 5 días y está representado por 0 a 4. Los mayas consideraban desafortunado el mes con menos fechas: en este mes no se celebran tribunales, la gente no se ocupa de transacciones, ni siquiera de limpieza de casas.
Por razones religiosas, los mayas también usaban otro calendario. La mitad de este calendario se llama calendario Tzolkin (año santo). El año se divide en 13 períodos diferentes, cada período tiene 20 días y cada día usa un número. expresado en forma combinada con una palabra. Los números utilizados son del 1 al 13 y hay 20 palabras utilizadas. Son: imix, ik, akbal, kan, chicchan, cimi, manik, lamat, muluk, ok, chuen, eb, ben, ix, mem, cib, caban, eznab, canac, ahau. Nota: Cada día del año tiene una descripción clara y única. Por ejemplo, al comienzo del año, la fecha se describe de la siguiente manera: 1 imix, 2 ik, 3 akbal, 4 kan, 5 chicchan, 6 cimi, 7 manik, 8 lamat, 9 muluk, 10ok, 11 chuen, 12 eb, 13 ben, 1 ix, 2 mem, 3 cib, 4 caban, 5 eznab, 6canac, 7 ahau, 8 imix, 9 ik, 10 akbal... Es decir, los números y las palabras se
utilizan en ciclos de forma independiente .
Los años en el calendario Haab y el calendario Tzolkin están representados por los números 0, 1, ..., y el número 0 indica el comienzo del mundo. Entonces, el primer día se expresa como:
• Haab: 0. pop 0
• Tzolkin: 1 imix 0
Por favor, ayude al profesor MA Ya a escribir un programa para transformar el calendario Haab en un calendario Tzolkin.

entrar

• Los datos del calendario Haab se representan mediante los siguientes métodos:
• Número del día. Mes Año (fecha. Mes Año)
• La primera línea de la entrada indica la cantidad de datos de la fecha del calendario Haab que se convertirán. Cada línea subsiguiente
representa una fecha y el número de años es inferior a 5000.

Salida

• Los datos en el calendario Tzolkin se representan de las siguientes maneras:
• Número Nombre del día Año (día número día nombre año número)
• La primera línea representa el número de fechas de salida. Cada fila a continuación representa una fecha en el calendario Tzolkin correspondiente en los datos de entrada.

Ideas para resolver problemas

Encuentre el número total de días bajo la cronología haab y luego conviértalo a la cronología tzolkin.
Vale la pena señalar que el método de memoria haab cuenta desde 0 cada mes.
Primero configure dos funciones de cadena haab y tzolin para completar la conversión del nombre del mes y el número del mes, luego configure una matriz de estructura para registrar el tiempo y finalmente calcule la suma de días y conviértala en salida de tzolkin.

Código fuente

#include<iostream>
#include<cstdio>
#include<string>
using namespace std;
const int N = 5000;
struct data {
    
    
	int year,day;
	string month;
} p[N];
int n;
int main() {
    
    
	string haab[] = {
    
    "pop","no","zip","zotz","tzec",
	                 "xul","yoxkin","mol","chen","yax","zac","ceh",
	                 "mac","kankin","muan","pax","koyab","cumhu","uayet"
	                };
	string tzo[] = {
    
    "imix","ik","akbal","kan","chicchan","cimi",
	                "manik","lamat","muluk","ok","chuen","eb","ben","ix",
	                "mem","cib","caban","eznab","canac","ahau"
	               };
	cin>>n;
	cout<<n<<endl;
	for(int i = 1; i <= n; ++i) {
    
    
		scanf("%d. ",&p[i].day);
		cin>>p[i].month;
		cin>>p[i].year;
		int year,month,day,t,cnt;
		for(int j = 0; j<19; ++j) {
    
    
			if(p[i].month==haab[j]) {
    
    
				t = j;
				break;
			}
		}
		cnt = p[i].year*365+t*20+p[i].day;//计数共过了多少天
		year = cnt/260;// 按tzolki算经历了多少年
		cnt = cnt%260;//算出剩余总天数
		day =cnt%13+1;
		month = cnt%20;
		cout<<day<<" "<<tzo[month]<<" "<<year<<endl;
	}
	return 0;
}

B - Licencia diplomática

Reexpresión del problema

Para minimizar los gastos diplomáticos, los países de todo el mundo discuten lo siguiente. No es suficiente que cada país mantenga relaciones diplomáticas con como máximo un país, porque hay más de dos países en el mundo y algunos países no pueden comunicarse entre sí a través de (una serie de) diplomáticos.
• Esta pregunta asume que cada país mantiene relaciones diplomáticas como máximo con otros dos países. Tratar a todos los países por igual es una práctica diplomática no escrita. Por tanto, cada país mantiene relaciones diplomáticas con los otros dos países.
• Los topográficos internacionales proponen una estructura adecuada a esta necesidad. Organizarán a los países para formar un círculo para que cada país pueda establecer relaciones diplomáticas con sus dos vecinos. En el mundo real, el Ministerio de Relaciones Exteriores de un país se encuentra en la capital del país. En aras de la simplicidad, esta pregunta asume que la posición del capitel es un punto en un plano bidimensional. Si utiliza una línea recta para conectar las cancillerías de los países que mantienen relaciones diplomáticas
, el resultado es un polígono.
• Ahora, necesitamos establecer un lugar para las reuniones diplomáticas bilaterales entre dos países. Del mismo modo, por razones diplomáticas, los diplomáticos de los dos países deben viajar la misma distancia hasta el lugar. Para mejorar la eficiencia, la distancia de conducción debe acortarse tanto como sea posible. Prepárese para la conferencia diplomática bilateral.
• Entrada
• La entrada proporciona varios casos de prueba. Cada caso de prueba primero da el número n, lo que significa que hay n países involucrados. Esta pregunta asume que n3 es un número impar. Luego, se dan n pares de coordenadas xey para indicar la ubicación del Ministerio de Relaciones Exteriores. Las coordenadas del Ministerio de Relaciones Exteriores son números enteros con valores absolutos menores que 1012. El orden de los países es el mismo que el orden en el que aparecen en la entrada. Además, en la lista, el primer país es vecino del último país.
• Salida
• Para cada caso de prueba, primero genere el número de países en el caso de prueba (= n), y luego proporcione las coordenadas xey de la ubicación de la conferencia diplomática bilateral entre países. El orden de las ubicaciones de las reuniones de salida debe ser el mismo que el que se indica en la entrada. Partiendo del lugar de encuentro de los dos primeros países, continúa hasta el lugar de encuentro de los dos últimos países, y finalmente se produce el lugar de encuentro del enésimo país y el primer país.

(En términos simples, calcule el punto medio de dos números adyacentes)

análisis del problema

Siga las siguientes ideas:

  1. Definir la estructura para registrar las coordenadas xey
  2. Establezca una estructura al final y lea al final cada vez que haya un nuevo número.
  3. Calcule el valor promedio de último y la variable de estructura ahora que registra el conjunto anterior de números y salida
  4. Ahora = último
    debe tratarse especialmente para el primer número, porque se requiere la comparación del primero al último, se establece una estructura f primero para registrar el primer número de grupo.

Código fuente:

#include<cstdio>
#include<iostream>
using namespace std;
struct point {
    
    
	long long int x;
	long long int y;
};
int main() {
    
    
	struct point now,first,last;
	int n=0;
	while(~scanf("%d",&n)){
    
    
		printf("%d ",n);
		cin >>first.x >>first.y;
		now=first;
		for(int i=1;i<n;i++)
		{
    
    
			cin >>last.x >>last.y ;
			printf("%.6f %.6f ",(last.x+now.x)/2.0,(last.y+now.y)/2.0);
			now=last;
		}
		now=first;
		printf("%.6f %.6f\n",(last.x+now.x)/2.0,(last.y+now.y)/2.0);
	}`在这里插入代码片`
	return 0;
	}

En esta pregunta, cometí los siguientes errores:
1. El formato de salida es un número de punto flotante, y no he forzado una conversión de tipo, y no hay 2 más un punto decimal
2.xy y no está definido como un tipo largo y largo.

Las siguientes dos preguntas son el uso de punteros

C. Paciencia “acordeiana”

Reexpresión del problema

Por favor, imite el juego de la paciencia "Accordian" Las reglas son las siguientes:
• Los jugadores repartirán una baraja de cartas una por una, en una fila de izquierda a derecha, sin superponerse. Siempre que una carta coincida con la primera carta de la izquierda o la tercera carta de la izquierda, mueva esta carta encima de la carta correspondiente. El llamado partido de dos cartas significa que las dos cartas tienen el mismo valor (número o letra) o el mismo palo. Siempre que mueva una carta, verifique si la carta puede continuar moviéndose hacia la izquierda y solo mueva la carta en la parte superior del mazo cada vez. En este juego, dos pilas se pueden convertir en una pila. Si de acuerdo con las reglas, las cartas de la pila de la derecha se pueden mover a la pila de la izquierda una por una, y puede convertirse en una pila. Este juego mueve las cartas hacia la izquierda tanto como sea posible. Si solo hay un mazo al final, el jugador gana.
• Durante el juego, los jugadores pueden encontrarse con una situación en la que hay múltiples opciones a la vez. Cuando se pueden mover ambas cartas, se mueve la carta más a la izquierda. Si una carta puede moverse una posición a la izquierda o tres posiciones a la izquierda, muévala tres posiciones.

entrar

• Ingrese el orden en que se distribuyen las tarjetas. Cada caso de prueba consta de un par de filas, cada fila da 26 cartas, separadas por un carácter de espacio único. La última línea del archivo de entrada da un # como primer carácter. Cada naipe está representado por dos personajes. El primer carácter es el valor nominal (A = As, 2-9, T = 10, J = Jota, Q = Reina, K = Rey), y el segundo carácter es el palo (C = Tréboles (梅花), D = Diamantes (cuadrados), H = corazones (corazones), S = espadas (espadas)).

Salida

• Para cada par de filas en la entrada (52 cartas de una baraja de naipes), dé salida a una fila, dando el número de cartas que quedan en cada pila de cartas después de que se juega la fila de entrada correspondiente.
No tengo aire acondicionado para esta pregunta, así que omita

D - Teclado roto

Reexpresión del problema

Estás escribiendo un texto largo con un teclado defectuoso. El problema con este teclado es que de vez en cuando se presiona automáticamente la tecla "Inicio" o la tecla "Fin" cuando ingresa texto. No eres consciente de este problema, porque solo te enfocas en el texto y ni siquiera enciendes la pantalla. Una vez que termine de escribir, enciende el monitor y ve el texto en la pantalla. En chino, lo llamamos tragedia. Encuentre el texto de la tragedia.

entrar

• Ingrese varios casos de prueba. Cada caso de prueba es una línea, que contiene al menos una, hasta 100,000 letras, guiones bajos y dos caracteres especiales '[' y ']', donde '[' significa tecla "Inicio" y ']' significa tecla "Fin". La entrada termina con EOF.

Salida

• Para cada caso de prueba,
muestra la tragedia del texto en la pantalla la Muestra la Entrada
This_is_a_ [Beiju] _TEXT
[[]] [] [] Happy_Birthday_to_Tsinghua_University
la Muestra la Salida
BeijuThis_is_a__text
Happy_Birthday_to_Tsinghua_University

Esta pregunta tampoco tiene ac, no evaluar, omitir

E - Satélites

Reexpresión del problema

Inserte la descripción de la imagen aquí

entrar

• La entrada contiene uno o más casos de prueba.
• Una línea para cada caso de prueba, dando dos números enteros sy a, y una cadena "min" o "deg"; donde s es la distancia entre el satélite artificial y la superficie de la tierra, y a es la distancia entre los dos satélites artificiales al centro del ángulo de la tierra. En minutos (′) o en grados (◦), como unidad. La entrada no dará tanto puntos como grados.

Salida

• Para cada caso de prueba, genere una línea, dando la distancia del arco y la distancia de la cuerda lineal entre los dos satélites en kilómetros. La distancia es un número de punto flotante, que almacena seis dígitos después del punto decimal.

análisis del problema

Los problemas de cálculo matemático deben comprender el problema y enumerar las fórmulas.
Inserte la descripción de la imagen aquí
Puedes usar la resta de 360 ​​° para lidiar con ángulos que excedan los 180 °

#include<iostream>
#include<cmath>
using namespace std;
double s,a;
string op;
//acos(-1)表示Π
int main() {
    
    
	while(cin >> s >> a >> op) {
    
    
		if(op == "min") a /= 60;
		if(a > 180) a = 360 - a;
		double arcdist = 2*acos(-1)*(s+6440.0)*a/360;
		double chord_dist = (s + 6440.0)*sin(a*acos(-1)/360)*2;
		printf("%.6lf %.6lf\n",arcdist,chord_dist);
	}
	return 0;
}

G - La circunferencia del círculo

Reexpresión del problema

• Calcular la circunferencia de un círculo parece una tarea fácil, siempre que conozca el diámetro del círculo. Pero, ¿y si no lo sabes? Da las coordenadas cartesianas de 3 puntos no colineales en el plano. Su trabajo consiste en calcular el perímetro del único círculo que se cruza con estos 3 puntos.

entrar

• La entrada contiene uno o más casos de prueba, cada caso de prueba en una línea, incluidos 6 números reales x1, y1, x2, y2, x3, y3, que representan las coordenadas de 3 puntos. El diámetro determinado por estos 3 puntos no supera el millón. La entrada finaliza al final del archivo.

Salida

• Para cada caso de prueba, genere una línea y proporcione un número real que represente la circunferencia del círculo determinada por 3 puntos. La circunferencia de salida tiene una precisión de dos decimales. El valor de Pi es 3,141592653589793.

análisis del problema

Fórmula helen, dios mío
Inserte la descripción de la imagen aquí

Código fuente

#include<iostream>
#include<cmath>
#include<cstdio>
using namespace std;
double xa,ya,xb,yb,xc,yc,p;
double getDistance(double x,double y,double xx,double yy) {
    
    
	return sqrt(pow(x-xx,2)+pow(y-yy,2));
}
int main() {
    
    
	while(cin >> xa >> ya >> xb >> yb >> xc >> yc) {
    
    
		double a = getDistance(xa,ya,xb,yb);
		double b = getDistance(xb,yb,xc,yc);
		double c = getDistance(xa,ya,xc,yc);
		double p = (a+b+c)/2;
		double s = sqrt(p*(p-a)*(p-b)*(p-c));
		double d = a*b*c/2.0/s;
		printf("%.2f\n",d*acos(-1.0));
	}
	return 0;
}

para resumir

No tengo suficiente comprensión de las listas vinculadas, uso insuficiente y no estoy familiarizado con las bibliotecas de funciones comunes y las funciones de C, por lo que debería mejorar

Supongo que te gusta

Origin blog.csdn.net/seekerzhz/article/details/112853063
Recomendado
Clasificación