Maison  >  Article  >  développement back-end  >  Trois algorithmes pour trouver des nombres palindromes en langage C

Trois algorithmes pour trouver des nombres palindromes en langage C

little bottle
little bottleavant
2019-04-30 09:30:3810442parcourir

L'article partagé par l'éditeur aujourd'hui concerne trois algorithmes pour décrire les nombres palindromes en langage C. Il a une certaine valeur de référence. Si vous êtes intéressé par les nombres palindromes en langage C, vous pouvez y jeter un œil. pour vous.

Description du problème

  • Remarque : (Ces numéros de palindrome n'ont pas de 0 en tête)
  • Les numéros de palindrome à 1 chiffre ont 0, 1 , 2, 3, 4, 5, 6, 7, 8, 9, 10 au total
  • Les nombres palindromes à 2 chiffres sont 11, 22, 33, 44, 55, 66, 77, 88, 99. 9 au total ;

* Puis-je demander : combien y a-t-il de palindromes à n chiffres ? Veuillez écrire une fonction récursive pour résoudre ce problème ! ! !

  • [Format d'entrée] Un entier positif par ligne, représentant le nombre de chiffres
  • [Format de sortie] Un entier positif par ligne, représentant le nombre de poèmes palindromes
  • [ Exemple d'entrée] 2
  • [Exemple de sortie] 9

Trois algorithmes pour trouver des nombres palindromes en langage C

Entrée :
3
Sortie :
90

Entrée :
5
Sortie :
900

**Entrée :
10
Sortie :
90000 **

Entrée :
8
Sortie :
9000

Entrée :
1
Sortie :
10

Analyse d'idées

  1. Lisez le nombre via une boucle for, inversez les données via les opérations / et %, puis comparez si le nombre inversé est égal au nombre d'origine
  2. Trois algorithmes pour trouver des nombres palindromes en langage C

  3. Lisez ce nombre à travers une boucle for, prenez le premier nombre et le dernier nombre à chaque fois, et comparez si les deux nombres sont égaux. , puis supprimez ces deux nombres jusqu'à ce qu'il reste un nombre (un nombre impair de chiffres) ou deux nombres (un nombre pair de chiffres)
  4. Trois algorithmes pour trouver des nombres palindromes en langage C

  5. Utilisez la relation mathématique pour déterminer directement le nombre de chiffres et calculer le nombre de palindromes à l'intérieur de ce chiffre

    • Par exemple : 99899
    • peut être divisé en deux moitiés, prenez la première moitié 998, s'il s'agit d'un nombre palindrome, la seconde moitié doit correspondre à sa position correspondante, 998 est un caractère à 3 chiffres,** A l'exception du premier bit (hors 0 de début), il y a 9 choix (1-9) pour la position correspondant à la seconde moitié, les autres chiffres ont 10 choix pour la position correspondante (0-9)* *, par exemple, le deuxième chiffre et l'avant-dernier chiffre (0-9)

      , donc le même nombre de chiffres peut être résumé. Si le nombre de chiffres est un nombre impair, le nombre palindrome est 9*10^(n/. 2) , notez que n/2 est un entier et que le nombre de chiffres avec un nombre pair est
    • 9
    • 10^(n/2-1), donc le nombre palindrome des nombres à 5 chiffres est 9
      10*10 =900
    • Notez qu'il y a 10 chiffres (0-9) pour 1, qui nécessitent un traitement spécial
  6. Tutoriels associés :
Tutoriel vidéo C

Description du code

1. 第一种思路:
#include <stdio.h>
#include <math.h>
int reverse(long int i,long int *terminate)        //递归函数求数值的逆序
{
    if (i<=0){              //递归出口
        return 1;       
    }
    else{
        *terminate*=10;     //每次乘10升位数
        *terminate+=i%10;      //加上个位
        reverse(i/10,terminate);        //递归每次规模缩小
    }
    return 1;
}
int main ()
{
    int n;
    scanf ("%d",&n);            //读入一个n,表示n位整数
   long int i;        
    int count=0;
    if (n==1){               //如果等于1,则有10个(0-9都是),特殊处理;
        printf ("10");
        return 0;
    }
    for (i=pow(10,n-1);i<pow(10,n);i++){       //从第一个n位数开始(10^(n-1)),到(10^n)-1
       long int terminate=0;                //定义一个逆序目标数
        reverse(i,&terminate);              //把i和逆序目标数传入
        if (terminate==i){                  //逆序后还和原数相等,则可计数
            count++;
        }
    }
    printf ("%d",count);        //输出个数
    return 0;
}

2. 第二种思路:
#include <stdio.h>
#include <math.h>
int judge(int i,int n)
{
    int first,last;
    if (n<=1){          //规模减小,直到n为1(偶数)或者0
        return 1;

    }
    else{
        first=i/pow(10,n-1);        //头位数字
        last=i%10;                  //末位数字
        if (first!=last){           //头位末尾不一样直接退出
            return 0;
        }
        int tem=pow(10,n-1);        
    judge(i%tem/10,n-2);            //剔除头尾剩下中间,位数减二

    }
}
int main ()
{
    int n;
    scanf("%d",&n);
    if (1==n){
        printf ("10");
        return 0;
    }
    int i;
    int count=0;
   long long  low=pow(10,n-1);      //循环入口
    long long high=pow(10,n);       //循环出口
    for (i=low;i<high;i++){
       if ( judge(i,n)==1){         //判断i是否为回文,计数
           count++;
       }
    }
    printf ("%d",count);
    return 0;
}

3. 第三种思路:
#include <stdio.h>
#include <math.h>
int main (){
    int n;
    scanf ("%d",&n);
    int ji=9*pow(10,n/2),ou=9*pow(10,n/2-1);
    if (n==1){
        printf ("10");
    }
    else if  (n==2){
        printf ("%d",9);
    }
    else if (n%2==1){
        printf ("%d",ji);
    }
    else if (n%2==0){
        printf("%d",ou);
    }
    return 0;
}

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer