zoukankan      html  css  js  c++  java
  • A1136. Delayed Palindrome

    Consider a positive integer N written in standard notation with k+1 digits ai​​ as ak​​a1​​a0​​ with 0 for all i and ak​​>0. Then N is palindromic if and only if ai​​=aki​​ for all i. Zero is written 0 and is also palindromic by definition.

    Non-palindromic numbers can be paired with palindromic ones via a series of operations. First, the non-palindromic number is reversed and the result is added to the original number. If the result is not a palindromic number, this is repeated until it gives a palindromic number. Such number is called a delayed palindrome. (Quoted from https://en.wikipedia.org/wiki/Palindromic_number )

    Given any positive integer, you are supposed to find its paired palindromic number.

    Input Specification:

    Each input file contains one test case which gives a positive integer no more than 1000 digits.

    Output Specification:

    For each test case, print line by line the process of finding the palindromic number. The format of each line is the following:

    A + B = C
    

    where A is the original number, B is the reversed A, and C is their sum. A starts being the input number, and this process ends until C becomes a palindromic number -- in this case we print in the last line C is a palindromic number.; or if a palindromic number cannot be found in 10 iterations, print Not found in 10 iterations. instead.

    Sample Input 1:

    97152
    

    Sample Output 1:

    97152 + 25179 = 122331
    122331 + 133221 = 255552
    255552 is a palindromic number.
    

    Sample Input 2:

    196
    

    Sample Output 2:

    196 + 691 = 887
    887 + 788 = 1675
    1675 + 5761 = 7436
    7436 + 6347 = 13783
    13783 + 38731 = 52514
    52514 + 41525 = 94039
    94039 + 93049 = 187088
    187088 + 880781 = 1067869
    1067869 + 9687601 = 10755470
    10755470 + 07455701 = 18211171
    Not found in 10 iterations.


    #include<iostream>
    #include<algorithm>
    #include<string.h>
    using namespace std;
    typedef struct NODE{
        int num[1010], len;
        NODE(){
            fill(num, num + 1010, 0);
            len = 0;
        }
    }bign;
    void add(bign &a, bign &b, bign &c){
        c.len = 0;
        b.len = 0;
        for(int i = a.len - 1; i >= 0; i--){
            b.num[b.len++] = a.num[i]; 
        }
        int carry = 0;
        int i;
        for(i = 0; i < b.len && i < a.len; i++){
            int sum = a.num[i] + b.num[i] + carry;
            carry = sum / 10;
            c.num[c.len++] = sum % 10;
        }
        while(i < b.len){
            int sum = carry + b.num[i];
            c.num[c.len++] = sum % 10;
            carry = sum / 10;
        }
        while(i < a.len){
            int sum = carry + a.num[i];
            c.num[c.len++] = sum % 10;
            carry = sum / 10;
        }
        if(carry != 0){
            c.num[c.len++] = carry;
        }
    }
    int isReverse(bign a){
        for(int i = 0, j = a.len - 1; i <= j; i++, j--){
            if(a.num[i] != a.num[j])
                return 0;
        }
        return 1;
    }
    int main(){
        char ss[1000];
        scanf("%s", ss);
        bign a, b, c;
        for(int i = strlen(ss) - 1; i >= 0; i--){
            a.num[a.len++] = ss[i] - '0';
        }
        int tag = 0;
        if(isReverse(a)){
            for(int i = a.len - 1; i >= 0; i--){
                printf("%d", a.num[i]);
            }
            printf(" is a palindromic number.");
            return 0;
        }
        for(int i = 0; i < 10; i++){
            add(a,b,c);
            for(int k = a.len - 1; k >= 0; k--){
                printf("%d", a.num[k]);
            }
            printf(" + ");
            for(int k = b.len - 1; k >= 0; k--){
                printf("%d", b.num[k]);
            }
            printf(" = ");
            for(int k = c.len - 1; k >= 0; k--){
                printf("%d", c.num[k]);
            }
            printf("
    ");
            if(isReverse(c)){
                tag = 1;
                for(int j = c.len - 1; j >= 0; j--){
                    printf("%d", c.num[j]);
                }
                printf(" is a palindromic number.");
                break;
            }else{
                for(int k = 0; k < c.len; k++){
                    a.num[k] = c.num[k];
                }
                a.len = c.len;
            }
        }
        if(tag == 0){
            printf("Not found in 10 iterations.
    ");
        }
        cin >> ss;
        return 0;
    }
    View Code

    总结:

    1、大整数相加的问题。要注意的是,在a+b做完之后,要注意检查carry是否为0,如果不为0的话,需要再把carry加上。

    2、1230的相反是0123而不是123,所以本题相当于两个待加的数字位数都相同,所以可以直接用两个string做加法,比使用大整数模拟要快一些。

  • 相关阅读:
    MVP 实战
    Model 层
    Presenter 层
    View 层
    DB数据库的基本操作
    MongoDB数据库基本操作
    转换函数
    字符串函数
    空值处理
    Java中使用Redis的几种数据类型总结
  • 原文地址:https://www.cnblogs.com/zhuqiwei-blog/p/9560088.html
Copyright © 2011-2022 走看看