1. 程式人生 > >藍橋杯 歷屆往題-迴文數字

藍橋杯 歷屆往題-迴文數字

  歷屆試題 迴文數字  時間限制:1.0s   記憶體限制:256.0MB問題描述  觀察數字:12321,123321 都有一個共同的特徵,無論從左到右讀還是從右向左讀,都是相同的。這樣的數字叫做:迴文數字。

  本題要求你找到一些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

    首先來看呢,這道題目只需要讓你找出5位和6位的滿足所有位數和為n的迴文數。所以呢

    1.找出5位的

            因為迴文數的萬位數和個位數必定相等,一共有9種可能,這時用變數i來控制這個迴圈。千位和十位必定相等,一共有10種可能,用變數j來控制它。百位只有一個,它也有10種可能,用變數z來控制它。

    2.找出6位的

            根據1,可以用同樣的方法來做。

     我們用vector來儲存所有的迴文數,最後列印.

#include<iostream>

#include<vector>
//#include<string>


using namespace std;
int main()
{
int num;
cin >> num;
if (num > 54)
{
cout << "-1" << "\n";
return 0;
}
vector<int> v;
for(int i=1;i<10;i++)
for(int j = 0;j<10;j++)
for (int z = 0; z < 10; z++)
{
if (2 * i + 2 * j + z == num)
v.push_back(i * 10001 + j * 1010 + z * 100);
}
for(int i=1;i<10;i++)
for(int j=0;j<10;j++)
for (int z = 0; z < 10; z++)
{
if (2 * i + 2 * j + 2 * z == num)
v.push_back(i * 100001 + j * 10010 + z * 1100);
}
for (int i = 0; i < v.size(); i++)
cout << v[i] << "\n";
    return 0;

}