付翔的专栏
在鄙视中成长 记录成长的点滴
posts - 106,  comments - 32,  trackbacks - 0

Reverse and Add



The  reverse and add  function starts with a number, reverses its digits and adds the reverse to the original. If the sum is not a palindrome (meaning it does not give the same number read from left to right and right to left), we repeat this procedure until it does.

For example, if we start with 195 as the initial number, we get 9,339 as the resulting palindrome after the fourth addition:

195
786
1,473
5,214
591
687
3,741
4,125
+ ---
+ ---
+ ---
+ ---
786
1,473
5,214
9,339

This method leads to palindromes in a few steps for almost all of the integers. But there are interesting exceptions. 196 is the first number for which no palindrome has been found. It has never been proven, however, that no such palindrome exists.

You must write a program that takes a given number and gives the resulting palindrome (if one exists) and the number of iterations/additions it took to find it.

You may assume that all the numbers used as test data will terminate in an answer with less than 1,000 iterations (additions), and yield a palindrome that is not greater than 4,294,967,295.

Input

The first line will contain an integer N ( 0 < N$ \le$100), giving the number of test cases, while the next N lines each contain a single integer P whose palindrome you are to compute.

Output

For each of the N integers, print a line giving the minimum number of iterations to find the palindrome, a single space, and then the resulting palindrome itself.

Sample Input

3
195
265
750

Sample Output

4 9339
5 45254
3 6666
一个简单的处理问题 直接用加法模板 过的 这个服务器由于是gcc标准 所有很多以前用习惯的函数 都不支持 如 strrev  还得自己写个
不过还好 不难

贴上代码
#include <stdio.h>
#include 
<string.h>
#include 
<stdlib.h>
const int maxn = 110;

void add(char a[],char b[],char back[])
{
    
int i,j,k,up,x,y,z,l;
    
char *c;
    
if (strlen(a)>strlen(b)) l=strlen(a)+2else l=strlen(b)+2;
    c
=(char *) malloc(l*sizeof(char));
    i
=strlen(a)-1;
    j
=strlen(b)-1;
    k
=0;up=0;
    
while(i>=0||j>=0)
        {
            
if(i<0) x='0'else x=a[i];
            
if(j<0) y='0'else y=b[j];
            z
=x-'0'+y-'0';
            
if(up) z+=1;
            
if(z>9) {up=1;z%=10;} else up=0;
            c[k
++]=z+'0';
            i
--;j--;
    }
    
if(up) c[k++]='1';
    i
=0;
    c[k]
='\0';
    
for(k-=1;k>=0;k--)
        back[i
++]=c[k];
    back[i]
='\0';
}
char *strrev(char *s)
{
    
if (s == NULL || s[0== '\0')
        
return s;    
    
for (char t, *= s, *= s + strlen(s) - 1; p < q; p++, q--)
        t 
= *p, *= *q, *= t;
    
    
return s;
}
bool isReverse(char str[])
{
    
char *temp;
    temp 
= (char*)malloc(sizeof(char)*(strlen(str) +3));
    strcpy(temp,str);
    strrev(temp);
    
//temp = strrev(str);
    if(strcmp(str,temp)==0)
        
return true;
    
return false;
}
int main()
{
    
char str1[maxn],str2[maxn],back[maxn];
    
int i,n,num,T;
    scanf(
"%d\n",&T);
    
while(T--)
    {
        i 
= 0;
        gets(str1);
        strcpy(str2,str1);
        strrev(str2);
        strcpy(back,
"0");
        
while(!isReverse(str1))
        {
            add(str1,str2,back);
            strcpy(str1,back);
            strcpy(str2,str1);
            strrev(str2);
            i 
++;
        }
        printf(
"%d %s\n",i,str1);

    }
    
    
return 0;
}


posted on 2010-07-23 19:43 付翔 阅读(184) 评论(0)  编辑 收藏 引用 所属分类: ACM 数据结构

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理



<2010年7月>
27282930123
45678910
11121314151617
18192021222324
25262728293031
1234567

常用链接

留言簿(2)

随笔分类

随笔档案

文章分类

文章档案

CSDN - 我的blog地址

博客

搜索

  •  

最新评论

阅读排行榜

评论排行榜