算法训练 回文数

问题描述

  若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数。
  例如:给定一个10进制数56,将56加65(即把56从右向左读),得到121是一个回文数。

  又如:对于10进制数87:
  STEP1:87+78 = 165 STEP2:165+561 = 726
  STEP3:726+627 = 1353 STEP4:1353+3531 = 4884

  在这里的一步是指进行了一次N进制的加法,上例最少用了4步得到回文数4884。

  写一个程序,给定一个N(2<=N<=10或N=16)进制数M(其中16进制数字为0-9与A-F),求最少经过几步可以得到回文数。
  如果在30步以内(包含30步)不可能得到回文数,则输出“Impossible!”

输入格式

  两行,N与M

输出格式

  如果能在30步以内得到回文数,输出“STEP=xx”(不含引号),其中xx是步数;否则输出一行”Impossible!”(不含引号)

样例输入

9
87

样例输出

STEP=6

分析:分N =16和2<=N<=10两种情况讨论,str接收给定的字符串

设定在30次循环内判定str是否是回文字符串,不是则str与str的反置相加,将结果先赋给str1,
然后再赋回str

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define M 30
char str[M],str1[M];
int len;
int Ispalindrome()//判断回文数
{
    int i;
    for(i=0;i<len/2;i++)
        if(str[i] != str[len-i-1])
            return 0;
    return 1;
}
int main()
{
    int n,i,j,t;
    int t1,flag;
    char temp[2] = {‘\0‘};
    scanf("%d%s",&n,&str);
    len = strlen(str);
    j = 0;
    flag = 0;if(n == 16)
    {
        for(t=0;t<30;t++)//30步以内得到回文数
        {
            if(!Ispalindrome())
            {
                for(i=0;i<len;i++)
                {
                    t1 = 0;
                    if(str[i]>=‘0‘ && str[i] <=‘9‘)
                        t1 += (str[i] - ‘0‘);
                    else
                        t1 += (str[i] - ‘A‘ + 10);
                    if(str[len-i-1]>=‘0‘ && str[len-i-1] <=‘9‘)
                        t1 += (str[len-i-1] - ‘0‘);
                    else
                        t1 += (str[len-i-1] - ‘A‘ + 10);
                    t1 += flag;
                    if(t1 >= n)//要进位
                    {
                        if(t1-n<= 9)
                            itoa(t1-n,temp,10);//整型转化为字符型
                        else
                            temp[0] = ‘A‘ + (t1-n-10);
                        flag = 1;
                        str1[j++] = temp[0];
                    }
                    else{
                        if(t1<= 9)
                            itoa(t1,temp,10);//整型转化为字符型
                        else
                            temp[0] = ‘A‘ + (t1-10);
                        flag = 0;
                        str1[j++] = temp[0];
                    }
                }
                if(flag)
                {
                    str1[j] = ‘1‘;
                    str1[j+1] = ‘\0‘;
                    flag = 0;//置0
                }
                else
                    str1[j] = ‘\0‘;
                strcpy(str,str1);//将str1赋值给str
                len = strlen(str) ;
                j = 0;
            }
            else{
                printf("STEP=%d\n",t);
                break;
            }
        }
        if(t == 30)
            printf("Impossible!\n");
    }
    else{
        for(t=0;t<30;t++)//30步以内得到回文数
        {
            if(!Ispalindrome())
            {
                for(i=0;i<len;i++)
                {
                    t1 = (str[i]-‘0‘) + (str[len-i-1] - ‘0‘) + flag;//要加flag
                    if(t1 >= n)//要进位
                    {
                        itoa(t1-n,temp,10);//整型转化为字符型
                        flag = 1;
                        str1[j++] = temp[0];
                    }
                    else{
                        itoa(t1,temp,10);//整型转化为字符型
                        flag = 0;
                        str1[j++] = temp[0];
                    }
                }
                if(flag)
                {
                    str1[j] = ‘1‘;
                    str1[j+1] = ‘\0‘;
                    flag = 0;//置0
                }
                else
                    str1[j] = ‘\0‘;
                strcpy(str,str1);//将str1赋值给str
                j = 0;
                len = strlen(str) ;
            }
            else{
                printf("STEP=%d\n",t);
                break;
            }
        }
        if(t == 30)
            printf("Impossible!\n");

    }
    return 0;
}
时间: 2025-01-14 14:13:55

算法训练 回文数的相关文章

C++基础算法之 回文数

// 常见算法.cpp : 定义控制台应用程序的入口点. //回文 #include "stdafx.h" #include <iostream> using namespace std; void reverse_num(int& n) { int rem = 0;//用于表示余数 int reverse = 0;//反转后的数字 int temp = 0; temp = n; while (temp !=0) { rem = temp%10; reverse =

PHP算法之回文数

判断一个整数是否是回文数.回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数. 示例 1: 输入: 121输出: true示例 2: 输入: -121输出: false解释: 从左向右读, 为 -121 . 从右向左读, 为 121- .因此它不是一个回文数.示例 3: 输入: 10输出: false解释: 从右向左读, 为 01 .因此它不是一个回文数.进阶: 你能不将整数转为字符串来解决这个问题吗? 来源:力扣(LeetCode) 1.这个转为字符串处理 class Solutio

算法之回文数判断

所谓回文字符 串就是指正读反读均相同的字符序列,如“席主席”.“记书记”.“aha”和“ahaha”均是回 文,但“ahah”不是回文. 通过栈这个数据结构我们将很容易判断一个字符串是否为回文. 1 // 4. 判断回文字符串 2 char a[9], s[9]; 3 int i, len, mid, next, top; 4 5 gets(a); // 读入一行字符串 6 // a = "qwerewq"; 7 len = strlen(a); 8 mid = len / 2 - 1

【LeetCode-面试算法经典-Java实现】【009-Palindrome Number(回文数)】

[009-Palindrome Number(回文数)] [LeetCode-面试算法经典-Java实现][所有题目目录索引] 原题 Determine whether an integer is a palindrome. Do this without extra space. 题目大意 判断一个数字是否是回访字数,不要使用额外的空间. 解题思路 为了不使用额外的空间,参考了其它的解决,那些解法看起来在isPalindrome方法中没有使用额外参数,但是却使用了方法调用,这个比一个整数消耗的

空间复杂度为O(1)的回文数判定算法

空间复杂度为O(1)的回文数判定算法 一.题设 实现空间复杂度为O(1)的回文数判定,输入为整型常数,要求输出判断是否为回文数. 要求格式如下: public boolean isPalindrome(int x) { //Your judge code } 二.概念 回文数(Palindrome)的定义:设n是一任意自然数.若将n的各位数字反向排列所得自然数n1与n相等,则称n为一回文数.例如,若n=1234321,则称n为一回文数:但若n=1234567,则n不是回文数. 特点: 1.负数.

回文数系列题目(经典算法)

回文数 时间限制:1000 ms  |  内存限制:65535 KB 难度:0 描述 请寻找并输出1至1000000之间的数m,它满足m.m^2和m^3均为回文数.回文数大家都知道吧,就是各位数字左右对称的整数,例如121.676.123321等.满足上述条件的数如m=11,m^2=121,m^3=1331皆为回文数. 输入 没有输入 输出 输出1至1000000之间满足要求的全部回文数,每两个数之间用空格隔开,每行输出五个数 解析:这道题直接模拟就好了,算是回文数中最简单的题了,直接写个判断回

算法趣题之回文数

题目:求用十进制.二进制.八进制表示都是回文数的所有数字中,大于十进制数10的最小值. 啥叫回文数:如果把某个十进制数按相反的顺序排列,得到的数和原来的数相同,则这个数就是"回文数".例如12321就是一个回文数. 这个题目拿Ruby.JavaScript.python.Java都很容易实现,因为这些语言都提供了字符串逆序处理的接口,或者相关其他接口,而C语言没有提供直接转换的接口,所以下面用C语言解题,其中设计的封装在工作中也会经常碰到,故记录并分享,如有错误或者有更好的算法,欢迎留

判断回文数算法

回文数是指正序(从左到右)读和倒序(从右到左)读都是一样的整数. 比如形如 121,1221,13531 的数字都是回文数,但 -121,10,25 等等都不是回文数. 如何判断一个数是回文数?这是一个很简单的算法,最常见的实现方式是使用一个栈或其他方法,把数字序列逆序,然后判断逆序后的数字是否等于原先的数字.显然这种实现方式需要至少 n 次循环才能完成判断. 本文提供一种更巧妙的方法,利用回文数的特点,只需要循环 \(\frac{n}{2}\) 次就可以完成判断了,代码及注释如下: bool

C语言之回文数算法

"回文"是指正读反读都能读通的句子.它是古今中外都有的一种修辞方式和文字游戏,如"我为人人,人人为我"等.在数学中也有这样一类数字有这种特征,成为回文数(palindrome number). 设n是一随意自然数.若将n的各位数字反向排列所得自然数n1与n相等,则称n为一回文数.比如,若n=1234321,则称n为一回文数.但若n=1234567,则n不是回文数. 上代码: #include <stdio.h> #define true 1 #defin