求迴文數的三種算法的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

clipboard.png

輸入:
3
輸出:
90函數

輸入:
5
輸出:
900spa

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

輸入:
8
輸出:
9000blog

輸入:
1
輸出:
10遞歸

思路分析

  1. 經過for循環讀入這個數,經過/和%操做將這個數據逆轉,而後再對比逆轉後的數字是否和原數字相等

    clipboard.png

  2. 經過for循環讀入這個數,每次取頭位一個數字和末位一個數字,依次比較這兩個數字是否相等,再去掉這兩個數字,直到剩下一個數字(位數爲奇數)或者剩下兩個數字(位數爲偶數)

    clipboard.png

  3. 經過數學關係,直接判斷位數,算出這個位數內的迴文數個數;ip

    • 例如: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),須要特殊處理

代碼描述

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

額外疑問

  • 第一第二種方法當n=10的時候運算不出來,求解爲什麼如此,是時間複雜度過高了嗎?仍是爆int了或者爆遞歸了?
相關文章
相關標籤/搜索