PTA L2-029 Felicidad inconformista (simulación)

L2-029 Maverick felicidad (25 puntos)

Hacer una suma de cuadrados de los dígitos de un número decimal se llama iteración. Si un número decimal puede obtener 1 a través de varias iteraciones, se le llama número feliz. 1 es un número feliz. Además, por ejemplo, 19 obtiene 82 después de 1 iteración, 68 después de 2 iteraciones, 100 después de 3 iteraciones y 1 al final. Entonces 19 es el número de felicidad. Obviamente, los números pasados ​​durante la iteración de un número de felicidad a 1 son todos números de felicidad, y su felicidad depende del número inicial. Por ejemplo, la felicidad de 82, 68 y 100 depende de 19. Y un número de felicidad inconformista no depende de ningún otro número dentro de un intervalo limitado; su independencia es el número de números de felicidad que se le atribuyen. Si este número sigue siendo un número primo, su independencia se duplica. Por ejemplo, 19 es un número de felicidad inconformista en el intervalo [1, 100], y su independencia es 2 × 4 = 8.

Por otro lado, si un número mayor que 1 entra en un bucle sin fin después de varias iteraciones, entonces el número no es feliz. Por ejemplo, 29 iteraciones obtienen 85, 89, 145, 42, 20, 4, 16, 37, 58, 89, ... Se puede ver que 89 a 58 forman un bucle sin fin, por lo que 29 no es feliz.

Esta pregunta requiere que escriba un programa para enumerar todos los números de felicidad inconformistas y su independencia en un intervalo dado.

Formato de entrada:

Ingrese los dos puntos finales del intervalo cerrado dado en la primera línea: 1 <A <B≤10
4
.

Formato de salida:

Enumere todos los números de felicidad inconformistas y su independencia en un intervalo cerrado dado [A, B] en orden creciente. Cada par de números ocupa una línea y los números están separados por 1 espacio.

Si no hay un número de felicidad en el intervalo, SAD se emite en una línea.

Ejemplo de entrada 1:

10 40

Muestra de salida 1:

19 8
23 6
28 3
31 4
32 3

** Nota: ** En el ejemplo, 10 y 13 también son números felices, pero se adjuntan a otros números (como 23, 31, etc.), por lo que no se muestran. Aunque otros números en realidad dependen de otros números de felicidad, debido a que esos números no están en el intervalo dado [10, 40], son números de felicidad inconformistas en el intervalo dado.

Ejemplo de entrada 2:

110 120

Muestra de salida 2:

SAD

Resolución de problemas

  1. Primero averigüe todos los números de felicidad en el intervalo 1-1e4
  2. Luego, de acuerdo con el intervalo de entrada [A, B], excluya otros números de felicidad.

Código

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <vector>
using namespace std;
const int maxn = 1e4 + 2;
bool vis[maxn];
bool prim[maxn];	//是否为素数 
int num[maxn];	

void getPrim(int n) {
    
    
	memset(prim, true, sizeof(prim));
	prim[1] = false;
	for(int i = 2; i <= n; i++) {
    
    
		if(prim[i]) {
    
    
			for(int j = i + i; j <= n; j += i) {
    
    
				prim[j] = false;
			}
		}
	}
}

int getn(int n) {
    
    
	int sum = 0;
	while(n > 0) {
    
    
		int a = n % 10;
		sum += a * a;
		n /= 10;
	}
	return sum;
}

int main() {
    
    
	getPrim(maxn - 1);
	int A, B;
	cin >> A >> B;
	vector<int> v;

	for(int i = 1; i < maxn; i++) {
    
    
		int a = i;
		int cnt = 0;
		while(!vis[a]) {
    
    
			vis[a] = true;
			cnt++;
//			cout << a << " ";
			a = getn(a);
		}
//		cout << a << endl;
		if(a == 1) {
    
    
			v.push_back(i);	//先将所有的幸福数找出来
			num[i] = cnt - 1;
		}
		memset(vis, false, sizeof(vis));
	}

	for(int i = 0; i < v.size(); i++) {
    
    	// 排除不要的幸福数
		int a = v[i];
		if(a < A || a > B) {
    
    
			vis[a] = true;
			continue;
		}
		while(a != 1) {
    
    
			a = getn(a);
			vis[a] = true;	//向前找到1, 把除自身以外的都标记为true
		}
	}
	
	bool isH = false;
	for(int i = 0; i < v.size(); i++) {
    
    
		if(!vis[v[i]]) {
    
    
			isH = true;
			int k = 1;
			if(prim[v[i]]) k++;
			cout << v[i] << " " << num[v[i]] * k << endl;;
		}
	}
	if(!isH) cout << "SAD" << endl;
	
	return 0;
}

Supongo que te gusta

Origin blog.csdn.net/qq_45349225/article/details/110211011
Recomendado
Clasificación