华师一附中OI组

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1138|回复: 1
打印 上一主题 下一主题

P1015 回文数

[复制链接]

738

主题

1485

帖子

5420

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5420
跳转到指定楼层
楼主
发表于 2018-5-26 20:39:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
https://www.luogu.org/problemnew/show/P1015

题目描述
若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数。

例如:给定一个十进制数 5656 ,将 5656 加 6565 (即把 5656 从右向左读),得到 121121 是一个回文数。

又如:对于十进制数 8787 :

STEP1: 8787 + 7878 = 165165
STEP2: 165165 + 561561 = 726726
STEP3: 726726 + 627627 = 13531353
STEP4: 13531353 + 35313531 = 48844884

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

写一个程序,给定一个 NN ( 2 \le N \le 10,N=162≤N≤10,N=16 )进制数 MM ( 100100 位之内),求最少经过几步可以得到回文数。如果在 3030 步以内(包含 3030 步)不可能得到回文数,则输出Impossible!

输入输出格式
输入格式:
两行,分别是 NN , MM 。

输出格式:
STEP=ans

输入输出样例
输入样例#1:
10
87
输出样例#1:
STEP=4
回复

使用道具 举报

738

主题

1485

帖子

5420

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5420
推荐
 楼主| 发表于 2018-7-23 20:49:34 | 只看该作者
  1. #include<iostream>
  2. using namespace std;
  3. int N;
  4. string M;
  5. string  rever(string s)
  6. {
  7.     int i,l=s.size();
  8.     string t="";
  9.     for (i=0; i<=l-1; i++) t=s[i]+t;
  10.     return t;
  11. }
  12. string add(string s,string t)
  13. {
  14.     int x,j,i,l1=s.size(),l2=t.size();
  15.     int x1,x2;
  16.     if (l1<l2)
  17.     {
  18.         swap(s,t);
  19.         swap(l1,l2);
  20.     }
  21.     for (i=1; i<=l1-l2; i++) t='0'+t;
  22.     string ss="";j=0;
  23.     for (i=l1-1; i>=0; i--)
  24.     {

  25.         if (s[i]<='9')x1=s[i]-'0';else x1=s[i]-'A'+10;
  26.         if (t[i]<='9')x2=t[i]-'0';else x2=t[i]-'A'+10;
  27.         x=x1+x2+j;
  28.         if (x>=N)
  29.         {
  30.             x=x-N;
  31.             j=1;
  32.         }
  33.         else j=0;
  34.         if (x<=9)ss=char(x+'0')+ss;
  35.         else ss=char(x-10+'A')+ss;
  36.     }
  37.     if (j==1) ss='1'+ss;
  38.     return ss;
  39. }
  40. string trim(string s)
  41. {
  42.     string t=s;
  43.     while (t[0]=='0' && t.size()>1) t.erase(0,1);
  44.     return t;
  45. }
  46. int main()
  47. {
  48.     int i;
  49.     cin>>N;
  50.     cin>>M;
  51.     for(i=0; i<=30; i++)
  52.     {
  53.     ///cout<<M<<endl;
  54.         string sm=rever(M);
  55.     /// cout<<sm<<endl;
  56.         if (M==sm) break;
  57.         else
  58.         {
  59.             M=add(M,sm);
  60.             M=trim(M);
  61.         }
  62.     }
  63.     if (i<=30) cout<<"STEP="<<i;
  64.     else cout<<"Impossible!";
  65.     return 0;

  66. }
复制代码
回复 支持 2 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|服务支持:DZ动力|华师一附中OI组  

GMT+8, 2024-11-2 06:27 , Processed in 0.149298 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表