首頁 >後端開發 >C#.Net教程 >c語言 三種求回文數的演算法

c語言 三種求回文數的演算法

little bottle
little bottle轉載
2019-04-30 09:30:3810514瀏覽

今天小編和大家分享的文章是c語言的三種描述回文數的演算法,具有一定參考價值,對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位的回文數有幾個?請編寫一個遞歸函數來解決此問題! ! !

  • 【輸入形式】一行一個正整數,代表多少位
  • 【輸出形式】一行一個正整數,代表回文詩的個數
  • 【範例輸入】2
  • 【範例輸出】9

c語言 三種求回文數的演算法


#3
輸出:
90

輸入:
5
輸出:
900

**輸入:
10
輸出:
90000 **

輸入:
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是整數,位數為偶數的為
      910^(n/2-1)個,所以5位數字的回文數有910*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刪除