注册 登录
编程论坛 数据结构与算法

回文数 C语言求解

软工学生 发布于 2013-05-12 17:18, 1590 次点击
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

3 回复
#2
软工学生2013-05-12 17:19
我是用数组进行操作,但是对于数的重复相加就不知道该怎样写了。
#3
apull2013-05-12 22:12
注释掉的输出可以帮助跟踪运行情况。
程序代码:

#include "stdio.h"
#include <stdlib.h>
#include <string.h>

#define MAX 10

int num[MAX];

int readNum()
{
    int n,i;
    printf("求回文数\n输入要测试的数字个数:");
    scanf("%d", &n);

    printf("输入%d个要测试的数字(12-100):\n",n);
    for(i=0;i<n;i++)
        scanf("%d",&num[i]);

//    for(i=0;i<n;i++)
//        printf("%d ", num[i]);
//    printf("\n");
    return n;   
}

int intrev(int n)
{
    char cnum[10];
    int result;

    itoa(n,cnum,10);
    strrev(cnum);
    result = atoi(cnum);

    //printf("%d -> %d\n",n,result);
    return result;
}

int huiwen(int n)
{
    char cnum[10],cnum2[10];
    int slen,i;
    slen = 0;

    itoa(n,cnum,10);
    itoa(n,cnum2,10);
    strrev(cnum2);

    slen = strlen(cnum);
    for(i=0;i < (slen/2);i++)
    {
        if(cnum[i] != cnum2[i]) return 0;
    }
    return 1;
}

int sum(int n, int count)
{
    int rev,s;

    count++;
    rev = intrev(n);
    s = n + rev;

    //printf("%d + %d = %d, count:%d\n",n,rev,s,count);

    if(huiwen(s)) return count;
   
    if(count > 80)
    {
        count = 0;
        return 0;
    }
   
    return sum(s,count);
}

int main()
{
    int nums,i,count;

    nums = readNum();

    for (i=0;i<nums;i++)
    {
        count = 0;
        count = sum(num[i],count);
        printf("%d\n",count);
    }
    return 0;
}

#4
邓士林2013-05-13 09:55
核心比较:int huiwen(int n)
{
    char cnum[10],cnum2[10];
    int slen,i;
    slen = 0;

    itoa(n,cnum,10);
    itoa(n,cnum2,10);
    strrev(cnum2);

    slen = strlen(cnum);
    for(i=0;i < (slen/2);i++)
    {
        if(cnum[i] != cnum2[i]) return 0;
    }
    return 1;
}

int
1