zoukankan      html  css  js  c++  java
  • 【程序设计竞赛】回文数字

    问题描述
      观察数字:12321123321 都有一个共同的特征,无论从左到右读还是从右向左读,都是相同的。这样的数字叫做:回文数字。
    
      本题要求你找到一些5位或6位的十进制数字。满足如下要求:
      该数字的各个数位之和等于输入的整数。
    输入格式
      一个正整数 n (10<n<100), 表示要求满足的数位和。
    输出格式
      若干行,每行包含一个满足要求的5位或6位整数。
      数字按从小到大的顺序排列。
      如果没有满足条件的,输出:-1
    样例输入
    44
    样例输出
    99899
    499994
    589985
    598895
    679976
    688886
    697796
    769967
    778877
    787787
    796697
    859958
    868868
    877778
    886688
    895598
    949949
    958859
    967769
    976679
    985589
    994499
    样例输入
    60
    样例输出
    -1

    分析:

    这个题目主要要明确两点:1.所有数字加起来和要等于N

                2.要满足回文

    故首先实现所有数字相加的功能

    int sum_number(int number,int &n)
    {
        int sum=0;
        while(number)
        {
            sum=sum+number%10;
            number=number/10;
            n++;
        } 
        return sum;
    }

    这里给出的形参列表中多一个n,是计算number的个数

    然后是判断回文:

    两种思路:1.用数组 2.用栈(这个方法太慢了)

    //用数组来进行判断
    bool echo_number(int number,int goal) 
    {
        int flag=true;
        int backup=number;//把数据取出来然后备份一下
        int size=0;
        int *data;
        if(goal==sum_number(number,size))
        {
            data=new int[size];
            int i=size;
            i--;
            while(backup)
            {
            data[i]=backup%10;
            backup=backup/10;
            i--;    
            } 
            for(int i=0;i<size;i++)
            {
                int n=number%10;
                if(data[i]!=n)
                {
                    flag=false;
                    break;
                }
                number=number/10;
            }
        }
        else
        {
            flag=false;
        }
        return flag;
    }    

    用栈的方式:(由于计算和与入栈相同,故把两个函数合并起来写了)

    bool echo_number(int number,int goal) 
    {
        int sum=0;
        stack<int> echo;
        int flag=true;
        int temp=number;//把数据取出来然后放在栈中
        while(temp)
        {
            sum=sum+temp%10;
            echo.push(temp%10);
            temp=temp/10;
        } 
        if(goal==sum)
        {
            while(echo.size())
            {
                int n=number%10;
                if(echo.top()!=n)
                {
                    flag=false;
                    break;
                }
            echo.pop();
            number=number/10;
            }
        }
        else
        {
            flag=false;
        }
        return flag;
    }

     完整代码

    正确代码: 

     1 #include<iostream>
     2 using namespace std;
     3 int sum_number(int number,int &n)
     4 {
     5     int sum=0;
     6     while(number)
     7     {
     8         sum=sum+number%10;
     9         number=number/10;
    10         n++;
    11     } 
    12     return sum;
    13 }
    14 bool echo_number(int number,int goal) 
    15 {
    16     int flag=true;
    17     int backup=number;//把数据取出来然后备份一下
    18     int size=0;
    19     int *data;
    20     if(goal==sum_number(number,size))
    21     {
    22         data=new int[size];
    23         int i=size;
    24         i--;
    25         while(backup)
    26         {
    27         data[i]=backup%10;
    28         backup=backup/10;
    29         i--;    
    30         } 
    31         for(int i=0;i<size;i++)
    32         {
    33             int n=number%10;
    34             if(data[i]!=n)
    35             {
    36                 flag=false;
    37                 break;
    38             }
    39             number=number/10;
    40         }
    41     }
    42     else
    43     {
    44         flag=false;
    45     }
    46     return flag;
    47 }    
    48 int main()
    49 {
    50     int n;
    51     int cont=0;
    52     cin>>n;
    53     for(int i=10000;i<=999999;i++)
    54     {
    55         if(echo_number(i,n))
    56         {
    57             cout<<i<<endl;
    58             cont++;
    59         }
    60     }
    61     if(cont==0)
    62     {
    63         cout<<"-1"<<endl;
    64     }
    65     return 0;
    66 }
    View Code

    用栈的方式,耗时很长:

     1 /*输入格式
     2   一个正整数 n (10<n<100), 表示要求满足的数位和。
     3 输出格式
     4   若干行,每行包含一个满足要求的5位或6位整数。
     5   数字按从小到大的顺序排列。
     6   如果没有满足条件的,输出:-1*/
     7 #include<iostream>
     8 #include<stack>
     9 using namespace std;
    10 bool echo_number(int number,int goal) 
    11 {
    12     int sum=0;
    13     stack<int> echo;
    14     int flag=true;
    15     int temp=number;//把数据取出来然后放在栈中
    16     while(temp)
    17     {
    18         sum=sum+temp%10;
    19         echo.push(temp%10);
    20         temp=temp/10;
    21     } 
    22     if(goal==sum)
    23     {
    24         while(echo.size())
    25         {
    26             int n=number%10;
    27             if(echo.top()!=n)
    28             {
    29                 flag=false;
    30                 break;
    31             }
    32         echo.pop();
    33         number=number/10;
    34         }
    35     }
    36     else
    37     {
    38         flag=false;
    39     }
    40     return flag;
    41 }
    42 int main()
    43 {
    44     int n;
    45     int cont=0;
    46     cin>>n;
    47     for(int i=10000;i<=999999;i++)
    48     {
    49         if(echo_number(i,n))
    50         {
    51             cout<<i<<endl;
    52             cont++;
    53         }
    54     }
    55     if(cont==0)
    56     {
    57         cout<<"-1"<<endl;
    58     }
    59     return 0;
    60 }
    View Code

    网上大神的代码:

     1 #include <iostream>
     2 #include <cstring>
     3 #include <algorithm>
     4 using namespace std;
     5 int Sum(int n)//求各位数之和
     6 {
     7     int sum=0;
     8     while(n)
     9     {
    10         sum+=(n%10);
    11         n/=10;    
    12     }
    13     return sum;
    14 }
    15 bool ishw(int n)//判断回文
    16 {
    17     char *s=new char;
    18     int m;
    19     s=itoa(n,s,10);    
    20     reverse(s,s+strlen(s));
    21     m=atoi(s);
    22     if(n==m)
    23         return true;
    24     return false;
    25 }
    26 int main()
    27 {
    28     int n,flag=0;
    29     cin>>n;
    30     for(int i=10000;i<1000000;i++)
    31     {
    32         if(ishw(i)&&Sum(i)==n)
    33         {
    34             if(!flag)
    35                 flag=1;
    36             cout<<i<<endl;    
    37         }        
    38     }
    39     if(!flag)
    40         cout<<"-1"<<endl;
    41     return 0;
    42 }
    43 
    44 --------------------- 
    45 作者:Hoper_ 
    46 来源:CSDN 
    47 原文:https://blog.csdn.net/reidsc/article/details/65938289 
    View Code

    (自己也得慢慢接触STL并且开始尝试用函数了,全部自己来做效率太低也很费时间)

  • 相关阅读:
    python调用go
    manjaro安装qt
    Ubuntu16.04 ROS安装kinect2并获取骨骼数据+配置kinect2_tracker_pd很不专业的博客-程序员宅基地
    Kinect XBOX 360和六轴机械臂的实时映射
    KinectV2.0 VS2019配置记录
    (29条消息) windows下用kinect V2 识别人体骨骼_interstellar-ai的博客-CSDN博客
    Baxter实战:Ubuntu16.04+Kinect2实现动作跟随
    Kinect2和六轴机械臂的实时映射(初步)
    CS395-T: Robot Learning from Demonstration and Interaction
    无需公网IP,远程SSH访问Linux服务器!
  • 原文地址:https://www.cnblogs.com/robotpaul/p/10190904.html
Copyright © 2011-2022 走看看