>백엔드 개발 >C#.Net 튜토리얼 >C 언어에서 회문 번호를 찾는 세 가지 알고리즘

C 언어에서 회문 번호를 찾는 세 가지 알고리즘

little bottle
little bottle앞으로
2019-04-30 09:30:3810515검색

오늘 편집자가 공유한 글은 C 언어의 회문 숫자를 기술하는 세 가지 알고리즘입니다. C 언어의 회문 숫자에 관심이 있으신 분들은 한 번 읽어보시면 도움이 될 것입니다. .

문제 설명

  • 참고: (이 회문 번호 앞에는 0이 없습니다.)
  • 1자리 회문 번호에는 총 0, 1, 2, 3, 4, 5, 6, 7, 8, 9가 포함됩니다. 10;
  • 두 자리 회문은 총 11, 22, 33, 44, 55, 66, 77, 88, 99, 9입니다.

* 묻고 싶습니다: n 자리 회문이 몇 개 있습니까? ? 이 문제를 해결하기 위해 재귀 함수를 작성해주세요! ! !

  • [입력 형식] 한 줄에 하나의 양의 정수, 자릿수를 나타냄
  • [출력 형식] 한 줄에 하나의 양의 정수, 회문 시의 수를 나타냄
  • [샘플 입력] 2
  • [샘플 출력] 9

C 언어에서 회문 번호를 찾는 세 가지 알고리즘

입력:
3
출력:
90

입력:
5
출력:
900

**입력:
10
출력:
900 00**

입력:
8
출력 :
9000

입력:
1
출력:
10

아이디어 분석

  1. 이 숫자를 for 루프를 통해 읽고, / 및 % 연산을 통해 데이터를 반전한 다음, 반전된 숫자가 올바른지 비교합니다. 같음 원래 숫자는 동일합니다
  2. C 언어에서 회문 번호를 찾는 세 가지 알고리즘

  3. 이 숫자를 for 루프로 읽고,매번 첫 번째 숫자와 마지막 숫자를 취하고, 두 숫자를 차례로 비교하여 같은지 그런 다음 제거합니다. 이 두 숫자는 한자리(홀수)가 남거나 두자리(짝수)가 남을 때까지
  4. C 언어에서 회문 번호를 찾는 세 가지 알고리즘

  5. 수학적 관계를 통해 직접 자릿수를 구하고 계산해 보세요. 이 숫자 내의 회문 번호

    • 예: 99899
    • 는 두 부분으로 나눌 수 있으며 첫 번째 절반은 998입니다. 두 번째 절반은 해당 위치인 998에 해당해야 합니다. 은 3자리
      단어입니다. **첫 번째 비트(선행 0 제외)를 제외하고 후반부에 해당하는 위치에는 9개의 선택(1~9)이 있고 나머지 숫자에는 10개의 선택(0~9)이 있습니다. 해당 위치* * 예를 들어 두 번째 숫자와 끝에서 두 번째 숫자(0-9)
    • 그러므로 자릿수가 홀수이면 회문 개수는 9가 됩니다. *10^(n/2). 참고 n /2는 정수이고, 짝수가 있는 자릿수는
    • 9
      10^(n/2-1)이므로 5자리 회문의 수는 9입니다. 10*10=900
    • 자릿수는 1이고 10(0-9)이므로 특별한 처리가 필요합니다
관련 튜토리얼:

C 비디오 튜토리얼

코드 설명

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;
}

위 내용은 C 언어에서 회문 번호를 찾는 세 가지 알고리즘의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 segmentfault.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제