国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C > 正文

c語言描述回文數的三種算法

2020-01-26 13:28:18
字體:
來源:轉載
供稿:網友

題目描述

  • 注意:(這些回文數都沒有前導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

輸入:
3

輸出:
90

輸入:
5

輸出:
900

**輸入:
10

輸出:
90000**

輸入:
8

輸出:
9000

輸入:
1

輸出:
10

思路分析

通過for循環讀入這個數,通過/和%操作將這個數據逆轉,然后再對比逆轉后的數字是否和原數字相等

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

通過數學關系,直接判斷位數,算出這個位數內的回文數個數;

  • 例如: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了或者爆遞歸了?

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 咸宁市| 丁青县| 通渭县| 江阴市| 水城县| 正宁县| 新密市| 西乌珠穆沁旗| 延边| 尖扎县| 多伦县| 淮滨县| 成都市| 辛集市| 三河市| 班玛县| 青川县| 鹤峰县| 建平县| 新龙县| 吴江市| 江源县| 祁阳县| 安塞县| 昌黎县| 上虞市| 隆昌县| 来凤县| 安溪县| 沁阳市| 钟山县| 子长县| 余江县| 桐柏县| 南通市| 澄江县| 广宗县| 尉氏县| 衡南县| 武功县| 东乌珠穆沁旗|