yzoi1109&&viojs1042最小步数的一点看法——回文数

Description - 问题描述

有一天,雄霸传授本人风神腿法第一式:捕风捉影..............的步法(弟子一:堂主,你大喘气呀。风:你给我闭嘴。)捕风捉影的关键是换气(换不好就会大喘气...)。

使用捕风捉影这一招时并不是每一步都喘气,而是在特定的步数喘气。一般来说功力越高,喘气越稀疏。喘气的步数符合特定规律:第一要是SUSHU(弟子二:哇塞!堂主,你还会鸟语,我好好崇拜你呦!可是SUSHU是什么意思呢?风:笨蛋,那是汉语拼音!)第二要是一个回文数,回文数就是正反念一样的数,如:123321,121,5211314(弟子三:堂主,最后一个好象不是...风:废话,当然不是了,我是考察一下你们的纠错能力!)现在给出两个数M,N(5< =M< N< =100,000,000),你要算出M,N之间需要换气的都有哪几步。(包括M,N)。算出来的可以提升为本堂一级弟子,月薪(1000000000000000000000000000000000000000000  MOD  10  )元。

  可能在众位神犇看来这是一道水的不能再水的题目,但我认为还是有必要提一提的。首先,这是一道判断素数+回文数的题,对于回文数,百度的定义是如下的:

“回文”是指正读反读都能读通的句子,它是古今中外都有的一种修辞方式和文字游戏,如“我为人人,人人为我”等。在数学中也有这样一类数字有这样的特征,成为回文数(palindrome number)。

设n是一任意自然数。若将n的各位数字反向排列所得自然数n1与n相等,则称n为一回文数。例如,若n=1234321,则称n为一回文数;但若n=1234567,则n不是回文数。

  另外,他给出的c++判定代码如下:

 1 #include<iostream>
 2 using namespace std;
 3 bool symm(long m)
 4 {
 5 long temp = m,n=0;
 6 while (temp)
 7 {
 8 n = n*10+temp%10;
 9 temp = temp/10;
10 }
11 return (m == n);
12 }
13 int main(int argc, _TCHAR* argv[])
14 {
15 long m;
16 cout<<"请输入一个整数:";
17 cin>>m;
18 cout<<"输入了"<<symm(m)<<"个回文数!";
19 return 0;
20 }

  个人认为,对于回文数的判断基本可用该法进行。但同时亦可以string读入,用s.size()判断是奇是偶,后再从中向左向右搜索即可。



  我的代码:

 1 #include<iostream>
 2 #include<cmath>
 3 using namespace std;
 4 const int maxn=3000000;
 5 //int p[maxn];
 6 int m,n;
 7 //int sum=0;
 8 //void make()
 9 //{
10 //  p[1]=1;
11 //  for(int i=2;i<=sqrt(maxn);i++)
12 //      if(p[i]==0)
13 //          for(int j=2;j<=sqrt(maxn)/i;j++)
14 //              p[i*j]=1;
15 //}
16 bool pd_1(int m)
17 {
18     int temp=m,n=0;
19     while(temp)
20     {
21         n=n*10+temp%10;
22         temp/=10;
23     }
24     return (m==n);
25 }
26 //bool pd_2(int m)
27 //{
28 //  if(p[m])
29 //      return false;
30 //  else
31 //      return true;
32 //}
33 bool pd_2(int m)
34 {
35     for(int i=2;i<=sqrt(m);i++)
36     {
37         if(m%i==0)
38             return false;
39     }
40     return true;
41 }
42 bool pd_3(int m)
43 {
44     int k=m%10;
45     if((k==2||k==4||k==5||k==6||k==8||k==0)&&(m/10>=1))
46         return false;
47     else
48         return true;
49 }
50 int main()
51 {
52 //  make();
53     cin>>m>>n;
54     if (n>10000000)
55        n=10000000;
56     for(int i=m;i<=n;i++)
57     {
58         if(pd_1(i)&&pd_3(i))
59             if(pd_2(i))
60                 cout<<i<<endl;
61     }
62     return 0;
63 }
64 /**************************************************************
65     Problem: 1109
66     User: lwq
67     Language: C++
68     Result: Accepted
69     Time:559 ms
70     Memory:1320 kb
71 ****************************************************************/
时间: 2024-08-03 08:50:50

yzoi1109&&viojs1042最小步数的一点看法——回文数的相关文章

洛谷——P1609 最小回文数

题目描述 回文数是从左向右读和从右向左读结果一样的数字串. 例如:121.44 和3是回文数,175和36不是. 对于一个给定的N,请你寻找一个回文数P,满足P>N. 满足这样条件的回文数很多,你的任务是输出其中最小的一个. 输入输出格式 输入格式: 1行,一个正整数N.N的数值小于10^100,并且N没有前导0. 输出格式: 你的程序应该输出一行,最小的回文数P(P>N). 输入输出样例 输入样例#1: 复制 44 输出样例#1: 复制 55 说明 50%的数据,N<10^9 100%

C语言找出大于一个数的最小回文数的代码

下面代码内容是关于C语言找出大于一个数的最小回文数的代码,希望能对码农们有用途. #include <stdio.h>#include <stdlib.h>#include <string.h> void main(){char data[10] = {0}, res[10] = {0}, state[10] = {0}, len = 0, pos, bit = 0;scanf("%s",data); len = strlen(data); pos

7.9 字符串-最小的回文数

今天为大家讲述一道字符串的题目,重在理解思路,找到对应的某个值,如果挨个枚举时间复杂度过高, 而对字符串进行修改,灵活性会相应的高许多 题目描述 回文数是从前往后和从后往前得到的数是相同的. 现给你一个正整数N,请你找到比N大的最小的那个回文数P. 输入 输入包含多组测试数据. 每组输入一个正整数N,N不超过10000位,并且N不包含前导0. 输出 对于每组输入,输出比N大的最小的那个回文数P. 样例输入 Copy 44 3 175 样例输出 Copy 55 3 181 题解代码:#includ

算法训练 回文数

问题描述 若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数. 例如:给定一个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=1

寻找回文数的python的实现

寻找回文数 寻找回文数也是一个比较好玩的题目,也是学习python的一个简单的filter()函数的应用 解决方法:即按照回文数的特点进行即可. 方法一:一行代码解决 #coding=UTF-8 #寻找回文数 def is_palindrome(n): s=str(n) return s[0:len(s)//2]==s[-1:len(s)//2:-1] #return str(n)==str(n)[::-1] #测试 for i in filter(is_palindrome,range(100

codevs 1045 回文数

题目描述 Description 若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数. 例如:给定一个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进制的加法

Vijos 回文数

描述 若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数. 例如:给定一个10进制数56,将56加65(即把56从右向左读),得到121是一个回文数. 又如:对于10进制数87:STEP1:87+78 = 165 STEP2:165+561 = 726STEP3:726+627 = 1353 STEP4:1353+3531 = 4884在这里的一步是指进行了一次N进制的加法,上例最少用了4步得到回文数4884. 写一个程序,给定一个N(2<=N<=10或N=16)进制数

回文数C语言

题目描述 若一个数(首位不为0)从左到右读与从右到左读都是一样,这个数就叫做回文数,例如12521就是一个回文数. 给定一个正整数,把它的每一个位上的数字倒过来排列组成一个新数,然后与原数相加,如果是回文数则停止,如果不是,则重复这个操作,直到和为回文数为止.给定的数本身不为回文数. 例如:87则有: STEP1: 87+78=165 STEP2: 165+561=726 STEP3: 726+627=1353 STEP4: 1353+3531=4884 编写一个程序,输入M(12<=M<=1

双基回文数

问题: 如果一个整数n至少在两个不同进位制b1,b2下都是回文数(2≤b1,b2≤10)则n是双基回文数,注意回文数中不能包含前导0.输入n,n<1000000,输出比n大的最小双基回文数. 样例输入: 1600000 样例输出:1632995 1 #include <iostream> 2 using namespace std; 3 int main() 4 { 5 int i,j,k,flag,count = 0; 6 int a[50]; 7 long s,t; 8 cin>