【程序设计竞赛】回文数字

问题描述
  观察数字: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并且开始尝试用函数了,全部自己来做效率太低也很费时间)

posted @ 2018-12-28 15:37  巴塞罗那的余晖  阅读(704)  评论(0编辑  收藏  举报
//雪花飘落效果