第k回文数

来源:互联网 发布:imap端口号 编辑:程序博客网 时间:2024/06/02 01:59

问题:

给一个数k,给出第k个回文数


分析:

一位数9个,二位数9个;

三位数90个,四位数90个;

五位数900个,六位数900个;

。。。。。


给出代码:

#include <stdio.h>void calPalin(int iNum);int main(){int iNum;while (scanf("%d",&iNum)!=EOF){if (iNum<=0)   {printf("Error Input!\n\n");}else{calPalin(iNum);}}return 0;}void calPalin(int iNum){int iHalfLen,iHalf,iDegree,iDigit,iResult; //iHalfLen是回文数对称左边有几位,如12521左边是3位数  //iHalf是回文数对称的左边一半,如12521中的125;iDegree表示几位数;//iDigit表示某一几位数有多少回文数,如3位数有90个; iResult是结果int i;iDigit=9;   //赋初值为9for (iDegree=1;;iDegree++){if (iNum-iDigit<=0)  //该处=0时一定要退出!!{break;}iNum-=iDigit;if (iDegree%2==0)  //一位数和二位数中的回文数是一样多,三位数和四位数中也一样。。。{iDigit*=10;}}iHalfLen=(iDegree+1)/2;   //算某一回文数左边的位数,如12521左边有3位iHalf=1;        //我觉得精华之所在for (i=2;i<=iHalfLen;i++){iHalf*=10;         }iHalf+=iNum-1;iResult=iHalf;if (iDegree&1)  //如果是奇位数,那么右边比左边一半少一位{iHalf/=10;}while (iHalf)   //求最终结果{iResult=iResult*10+iHalf%10;iHalf/=10;}printf("The result is :   %d\n\n",iResult);}


原创粉丝点击