[Blue Bridge Cup] Real Exam Training 2014 C ++ A Group Question 4 Shi Fengshou Quick Calculation

Calcul rapide de Shi Fengshou

    La contribution révolutionnaire de l'algorithme de vitesse Shi Fengshou est la suivante: compter à partir de la position haute, prédire le report. Il n'y a pas besoin de neuf tableaux, ce qui bouleverse complètement les calculs manuels traditionnels!
    La base de base des calculs rapides est la multiplication d'un chiffre par plusieurs chiffres.
    Parmi eux, multiplier par 7 est le plus compliqué, prenez-le comme exemple.
    Parce que 1/7 est une décimale récurrente: 0,142857 ..., si le nombre de chiffres dépasse 142857 ..., il faut saisir 1. Il en va de
    même pour 2/7 , 3/7, ... 6 / 7. Décimales de cycle, si le nombre de chiffres dépasse n / 7, il est nécessaire d'entrer
    le programme ci-dessous n pour simuler le processus d'opération de multiplication par 7 dans l'algorithme de vitesse Shi Fengshou.
    La loi de la place des unités pour multiplier par 7 est la suivante: multiplier les nombres pairs par 2, multiplier les nombres impairs par 2 et additionner 5. Tous prennent uniquement la place des unités.
    La règle de retenue pour multiplier par 7 est:
complet 142857 ... en 1,
complet 285714 ... en 2,
complet 428571 ... en 3,
complet 571428 ... en 4,
complet 714285 ... en 5,
plein 857142 ... en 6

    Veuillez analyser le déroulement du programme et remplir les codes manquants dans la partie soulignée.


// Calcule le chiffre des 
unités int ge_wei (int a)
{ if (a% 2 == 0) return (a * 2)% 10; else return (a * 2 + 5)% 10; }




// 计算 进 位 
int jin_wei (char * p)
{ char * level [] = { "142857", "285714", "428571", "571428", "714285", "857142" };







char buf [7];
buf [6] = '\ 0';
strncpy (buf, p, 6);

int i;
pour (i = 5; i> = 0; i -) { int r = strcmp (niveau [i], buf); si (r <0) renvoie i + 1; tandis que (r == 0) { p + = 6; strncpy (buf, p, 6); r = strcmp (niveau [i], buf); si (r <0) renvoie i + 1; ______________________________; // 填空} }









return 0;
}

// Multiplie plusieurs chiffres par 7
void f (char * s) 
{ int head = jin_wei (s); if (head> 0) printf ("% d", head);

char * p = s;
while (* p) { int a = (* p-'0 '); int x = (ge_wei (a) + jin_wei (p + 1))% 10; printf ("% d", x); p ++; }




printf ("\ n");
}

int main ()
{ f ("428571428571"); f ("34553834937543"); return 0; }



 

Analyse du problème

Idées:

Pour les opérations d'ordre élevé, l'idée est la suivante. Chaque fois que le premier caractère de 6 bits est stocké dans buf et comparé au niveau le plus élevé. S'il est supérieur au niveau le plus élevé, cela signifie que le report est de 6 et que le les autres sont également comparés en séquence.

Comparez buf avec le niveau [i], si buf est supérieur au niveau [i], cela signifie que le buf actuel est plus grand que le niveau [i], donc le report est requis, et le chiffre de report est i + 1, (la logique ici peut être obtenu à partir du code de la fonction de report). Si buf = level [i], cela signifie que la chaîne buf actuelle est égale à la chaîne de niveau, alors elle doit être comparée plus tard, c'est-à-dire prendre les six derniers chiffres de la chaîne d'origine et la stocker dans buf, et comparer avec le niveau Carry, continuez simplement à comparer comme ça, le problème est, avant qu'il ne soit toujours buf est supérieur au niveau [i], retourne i + 1 (donné par le code de signification de la question), alors si buf est plus petit que le niveau [i], n'est-ce pas? Voulez-vous renvoyer une valeur constante? C'est la partie à remplir. Vous pouvez y penser, buf est plus grand que le niveau actuel [i], et le niveau précédent est retourné, donc i + 1 est retourné. Ensuite, buf est plus petit que le niveau actuel, et le retour est le i du niveau actuel (par analogie) Essayez cette conjecture, et considérez la continuité du code dans le remplissage vide et le code précédent. Si r <0 à l'avant, nous devons considérer la situation de r> 0 à l'arrière. Enfin, essayez votre hypothèse et vérifiez-la avec une calculatrice.

L'analyse de code spécifique est la suivante:

#include <iostream>
#include <algorithm> 
#include <string.h>
using namespace std;

//计算个位?
int ge_wei(int a)
{
	if(a % 2 == 0)
		return (a * 2) % 10;
	else
		return (a * 2 + 5) % 10;
}	

//计算进位?
int jin_wei(char* p)
{
	char* level[] = {
		"142857",
		"285714",
		"428571",
		"571428",
		"714285",
		"857142"
	};
	
	char buf[7];
	buf[6] = '\0';
	strncpy(buf, p, 6);
	
	int i;
	for(i=5; i>=0; i--){
		int r = strcmp(level[i], buf);
		if(r < 0) return i+1;	//level[i] < buf,得出进位数i+1 
		while(r==0){	//level[i] = buf
			p += 6;		//往后偏移6位,看看剩下的6位再比较,就是前面的一样,那么往后比较 
			strncpy(buf,p,6);
			r = strcmp(level[i], buf);
			if(r < 0) //buf 更大 ,进位为前一个i,即i+1 
				return i+1;
//			______________________________; ?//填空
			if(r > 0)	//buf 更小 ,进位为当前为i 
				return i;
		}	
	}
	
	return 0;
}

//多位数乘以7
void f(char* s)
{
	int head = jin_wei(s);	//head是s的进位 
	if(head > 0) printf("%d", head);	//输出进位 
	
	char* p = s;	
	while(*p){
		int a = (*p - '0');	//字符转数字 
		int x = (ge_wei(a) + jin_wei(p+1)) % 10;	//个位+后者字符串的进位取个位 
		printf("%d",x);
		p++;
	}
	
	printf("\n");
}

int main()
{
	f("428571428571");
	f("34553834937543");
	return 0;
}

 

Je suppose que tu aimes

Origine blog.csdn.net/weixin_44566432/article/details/115193755
conseillé
Classement