回文数 C语言求解

软工学生 2013-05-12 05:16:30
Description
若一个数(首位不为0)从左到右读与从右到左读都是一样,这个数就叫做回文数,例如12521就是一个回文数。
给定一个正整数,把它的每一个位上的数字倒过来排列组成一个新数,然后与原数相加,如果是回文数则停止,如果不是,则重复这个操作,直到和为回文数为止。给定的数本身不为回文数。
例如:87则有:
STEP1: 87+78=165
STEP2: 165+561=726
STEP3: 726+627=1353
STEP4: 1353+3531=4884
编写一个程序,输入M(12<=M<=100),输出最少经过几步可以得到回文数。如果在8步以内(含8步)不可能得到回文数,则输出0。


Input
第1行一个正整数L,代表测试数据的组数。
接下来L行每行一个整数M(12<=M<=100),M本身不为回文数;


Output
输出L行,第i行对应输入数据的第i+1行,输出最少需要的步数;如果步数大于8,则输出0。

Sample Input
3
12
87
89


Sample Output
1
4
0

...全文
1353 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
lm_whales 2013-05-13
  • 打赏
  • 举报
回复
unsigned long getRevNum(unsigned long x, int n) { unsigned long y=0; for(i=0;i<n;i++) { y*=10; y+=x%10; } return y; } unsigned long sumrev(unsigned long x, int n) return x+ getRevNum(x,n); ) int isplalindrome(unsigned long x,int n) { int i,j=1; int res=1; for(i=1;i<n;i++)j*=10; if(x<j)return 0; for(i=10;i<=j;i*=10,j/=10) { if(x/j ==x%i){res=0;break;} } return res; } int is_8plalindrome(unsigned long x) { int n=2; unsigned long t=x; unsigned long v=100; if(x<12)return -2;//比12小 if(x>100)return -1;//比100 大 if(x==100)return 1;//101 是回文,假设是 for(i=0;i<8;i++) { x=sumrev( x,n); if(x>v){ n++; v*=10; } if(isplalindrome(x,n))return i+1; } return 0; } int main() { unsigned long x ,t; int sucess= scanf("%u",&x); while {sucess >0 && (x<=100 && x>=12)) { t=is_8plalindrome(x); if(t>=0) printf("%u\n",t); sucess = scanf("%u",&x); } return 0; }
lm_whales 2013-05-13
  • 打赏
  • 举报
回复
100 不需要讨论,100+1=101 不管算不算,都很小。 12~99 最大99 假设每次加法都有进位,8次加法2+8=10位;长整型差不多了,数组用11位也够了。long long 绝对够用。 所以无论哪种方案,都没有问题(char 数组,或者长整型long long)
14号选手 2013-05-12
  • 打赏
  • 举报
回复
突然想到数组是有限制的 如果两个相加有进位的话也是个麻烦事,所以数组不是一个好的选择
14号选手 2013-05-12
  • 打赏
  • 举报
回复
楼上的方法已经很好了 我想的是用二维数组来存放每一个数据,但是那样空间开销就大多了
hugett 2013-05-12
  • 打赏
  • 举报
回复
M<100转换的步数不超过8。。肯定不会超过int的范围的。。不需要用大数。。

#include <stdio.h>

int Palindrome(int num){//求一个数的回文数。。
    int ret = 0, m;
    while(num){
        m = num % 10;
        ret = 10 * ret + m;
        num /= 10;
    }
    return ret;
}

int main(){
    int cas, i, num, pnum;
    scanf("%d", &cas);
    while(cas--){
        scanf("%d", &num);
        for(i = 0; i <= 8; ++i){
            pnum = Palindrome(num);
            if(pnum == num) break;
            num += pnum;
        }
        if(i <= 8) printf("%d\n", i);
        else printf("0\n");
    }
    return 0;
}
软工学生 2013-05-12
  • 打赏
  • 举报
回复
对程序里面数的处理,不太会。他不是简单的判断是否为回文数。
derekrose 2013-05-12
  • 打赏
  • 举报
回复
引用 1 楼 u010654875 的回复:
我是用数组进行操作,但是对于数的重复相加就不知道该怎样写了。
百度,c语言大数加法
derekrose 2013-05-12
  • 打赏
  • 举报
回复
你那里不会呢??
软工学生 2013-05-12
  • 打赏
  • 举报
回复
我是用数组进行操作,但是对于数的重复相加就不知道该怎样写了。

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧