Numéros persistants

La persistance multiplicative d'un nombre est définie par Neil Sloane (Neil JA Sloane dans The Persistence of a Number publié dans Journal of Recreational Mathematics 6, 1973, pp.97-98., 1973) comme le nombre d'étapes pour atteindre un un- numéro de chiffre lors de la multiplication répétée des chiffres. Exemple:
679 -> 378 -> 168 -> 48 -> 32 -> 6.

Autrement dit, la persistance de 679 est de 6. La persistance d'un nombre à un seul chiffre est de 0. Au moment d'écrire ces lignes, on sait qu'il existe des nombres avec la persistance de 11. On ne sait pas s'il y a des nombres avec la persistance de 12 mais on sait que s'ils existent, le plus petit d'entre eux aurait plus de 3000 chiffres.
Le problème que vous devez résoudre ici est: quel est le plus petit nombre tel que la première étape de calcul de sa persistance aboutisse au nombre donné?
Entrée
Pour chaque cas de test, il y a une seule ligne d'entrée contenant un nombre décimal avec jusqu'à 1000 chiffres. Une ligne contenant -1 suit le dernier cas de test.
Production
Pour chaque scénario de test, vous devez générer une ligne contenant un nombre entier satisfaisant à la condition énoncée ci-dessus ou une déclaration indiquant qu'il n'existe pas de nombre de ce type dans le format ci-dessous.
Exemple d'entrée
0
1
4
7
18
49
51
768
-1
Exemple de sortie
10
11
14
17
29
77 Un
tel nombre n'existe
pas.2688
Description: Étant donné un entier M, trouvez le plus petit entier N qui satisfait le produit de chaque chiffre de N égal à M. (Le nombre de chiffres de M ne dépasse pas 1000)
S'il n'y a pas d'entier N, sortez "Il n'y a pas de tel nombre.", Et terminez par l'entrée M = -1
Idée: Gourmand + haute précision
Supposons d'abord que ce nombre existe. Réfléchissez: dans quelles circonstances le nombre doit-il être le plus petit? On peut constater que le premier chiffre est le plus petit, et le deuxième chiffre est organisé par ordre croissant du chiffre le plus élevé au chiffre le plus bas. L'analyse montre que nous pouvons utiliser gourmand. Ensuite, nous pouvons obtenir l'idée gourmande suivante:
Ici, nous utiliserons la division des grands nombres. Donnez un exemple pour introduire la division des grands nombres:

Par exemple, divisez 524134 par 123. Le résultat est 4261

La source du premier bit 4 est que nous alignons 524 et 123, puis effectuons une soustraction circulaire. Le reste est 32. Les trois premiers bits 321 sur 32134 continuent à être alignés avec 123 et les trois premiers bits 321 sur 32134 sont aligné en continu avec 123. La soustraction circulaire est 2 fois et le reste est 75. Les trois premiers chiffres 753 sont alignés avec 123 et la boucle soustrait 6 fois. Les 15 autres, alignent 154 sur 123, qui ne peuvent être soustraits qu'une seule fois , donc le résultat est 4 2 6 1. (524134 n'est pas divisible par 123)

92进行for循环,
若输入的数能被k个i整除,
则将这k个i放到输出队列的末尾,并输入除以k*i;
当输入只剩下一位时,就可以按顺序输出结果了.

Ici, on commence à traverser à partir de 9, on trouve d'abord le plus grand facteur de ce nombre et on le met le plus bas possible (d'abord placer une place, puis dix place ...) car le nombre ainsi calculé est le plus petit (seul Meet les exigences du titre), puis passez de 2 lors de la sortie (l'ordre de parcours des facteurs de recherche et des facteurs de sortie est opposé) et de la sortie, et le résultat final est le plus petit résultat.

#include<stdio.h>
#include<string.h>
int main()
{
    
    
    char s1[1010];
    int a[1010],b[1010],x,y,i,j,k,l;
    while(scanf("%s",s1)!=EOF)
    {
    
    
    	k=0;int c[1010]={
    
    0},d[1010];
    	if(s1[0]=='-')
    	break;
    	l=strlen(s1);
    	for(i=0;i<l;i++)
    	a[i]=s1[i]-'0',d[i]=a[i];//存数
    	if(l==1)//如果是一位数直接特判
    	{
    
    
    		printf("1%d",a[0]);
		}
		else
		{
    
    
			int x=0,y=1,f=0,ff=0,t=0,ss;
			for(i=9;i>=2;i--)//循环遍历9~2
		   {
    
    
		  
		   	    y=i;//除y
		   		for(j=0;j<l;j++)
		   		d[j]=a[j];//用d来存a
		      f=0;//标记是否能除尽y也就是i 9~2
		      //模拟除法取余
			for(j=0;j<l;j++)
			{
    
    
				if(j==l-1)//循环结束
				{
    
    
					if(a[j]%y==0)//如果最后余数为0
					{
    
    
						f=1;//标记除尽
						b[t++]=i;//存结果
						ss=1;
						i=i+1;
						break;
					}
				}
				x=a[j]%y;//模拟除法过程,取余
				a[j+1]=a[j+1]+x*10;//下一位+x*10可以模拟除法想想为什么
			}//取余结束
			if(f==1)//如果最后余数为0除尽了
			{
    
    
				x=0;
				//模拟除法存商
				for(k=0;k<l;k++)
	            {
    
    
	            	x=d[k]%y;//用d来算对y的除法把他存到a里面方便下一次计算
	            	//因为d和a是等价的所以把d对y除求的商存入a用来下一次计算
	            	a[k]=d[k]/y;//存商
	            	d[k+1]=d[k+1]+x*10;//模拟除法
				}//存商结束
			}
			else//如果没除尽
			{
    
    
				for(j=0;j<l;j++)
		   		a[j]=d[j];//把刚刚存的d给a因为除不尽所以a不变
			}
		   }
		   int fff=0;
		 for(i=0;i<l;i++)
		 {
    
    
		 	if(i<(l-1)&&a[i]!=0)//有a[i]不为0就是没除尽,不符合题
		 	fff=1;
			if(a[l-1]!=1)//除尽最后肯定为1
			fff=1;
		 }
		if(fff==1)//不存在
		printf("There is no such number.");
		else
		for(i=t-1;i>=0;i--)//逆序输出b
		printf("%d",b[i]);
	}
	printf("\n");
   }
    return 0;
}

Je suppose que tu aimes

Origine blog.csdn.net/m0_46381590/article/details/113000603
conseillé
Classement