ホームページ  >  記事  >  バックエンド開発  >  C言語で回文数を求めるための3つのアルゴリズム

C言語で回文数を求めるための3つのアルゴリズム

little bottle
little bottle転載
2019-04-30 09:30:3810442ブラウズ

本日編集者が共有した記事は、C言語で回文を記述するための3つのアルゴリズムです。一定の参考になります。C言語の回文に興味のある方は、ぜひご覧ください。お役に立てれば幸いです。あなたへ。

タイトルの説明

  • 注: (これらの回文番号には先頭に 0 がありません)
  • 1 桁の回文番号には 0 があり、合計 1、2、3、4、5、6、7、8、9、10、
  • 2 桁の回文番号は 11、22、33、44、55、66、77、88、 99 合計 9;

* 質問したいのですが、n 桁の回文はいくつありますか?この問題を解決するには再帰関数を作成してください。 ! !

    #[入力形式] 桁数を表す 1 行につき 1 つの正の整数
  • #[出力形式] 回文詩の数を表す 1 行につき 1 つの正の整数
  • [入力例]2
  • 【出力例】9

C言語で回文数を求めるための3つのアルゴリズム##入力: 3

出力:

90

入力:
5

出力:

900

** 入力:
10

出力:

90000 **

入力:
8

出力:

9000

入力:
1

出力:

10

アイデア分析

for ループを通じてこの数値を読み取り、

/ および % 演算を通じてデータを反転し、反転した数値が元の数値と等しいかどうかを比較します
  1. for ループを通じてこの数値を読み取り、C言語で回文数を求めるための3つのアルゴリズム毎回最初の数値と最後の数値を取得し、2 つの数値を順番に比較して、

    、次に、残り 1 つの数字 (奇数桁) または 2 つの数字 (偶数桁) が残るまで、これら 2 つの数字を削除します。
  2. 数学的関係
  3. を通じて、桁数を直接決定し、この桁内の回文の数を計算します;
  4. C言語で回文数を求めるための3つのアルゴリズム例: 99899

  5. は 2 つの半分に分割できます。前半 998

    を取得します。回文数字の場合、後半は対応する位置に対応する必要があります。998 は 3 桁の です。ワード、** 最初のビット (先頭の 0 を除く) を除き、その数字には後半に対応する位置として 9 つの選択肢 (1 ~ 9) があり、他の数字には 10 の の選択肢 (0 ~ 9) があります。対応する位置* *、たとえば、2 番目の桁と最後から 2 番目の桁 (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;
    }
  6. 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言語で回文数を求めるための3つのアルゴリズムの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はsegmentfault.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。