タイトルリンク:回文番号[ブルーブリッジカップ]
時間制限:1秒メモリ制限:256 MB
タイトルの説明:
観測番号:12321と123321には共通の特徴があります。左から右に読み取っても、右から左に読み取っても、同じです。
このような番号は、回文番号と呼ばれます。
この質問では、5桁または6桁の10進数を見つける必要があります。次の要件を満たします。
数値の桁の合計が入力整数と等しい。
入力:
正の整数n(10 <n <100)。これは、満たす必要がある数字の合計を表します。
出力:
複数の行。各行には、要件を満たす5桁または6桁の整数が含まれています。番号は昇順で並べられます。
条件が満たされない場合、出力:-1
サンプル入力
45
サンプル出力
99999
質問:数値(10000 <= num <= 999999)が回文であり、数字の合計が入力した数値と等しいかどうかを確認します。
アイデア:判決をトラバースするだけです。
判断する方法は?
コード上:
int palindrome(int x)
{
int px=0,xx=x; // px:x倒序的结果 xx:记录x
int ans=0; //ans:数位和结果
while(x)
{
px = px*10+x%10;
ans += x%10;
x /= 10;
}
if(px==xx) // x为回文数
return ans; // 返回数位和
else
return -1;
}
pxを使用して逆順の結果を保存し、ansがデジタル合計を保存し、パリンドロームであるかどうかを判断し(pxとxxを使用して比較)、デジタル合計を直接返す場合は、返されたデジタル合計と入力番号を比較し、等しい場合は、次に要件を満たしていることを証明し、出力します。
あなたは賢い人を理解しなければなりませんか?
完全なコード:
#include<bits/stdc++.h>
using namespace std;
int palindrome(int x)
{
int px=0,xx=x; // px:x倒序的结果 xx:记录x
int ans=0; //ans:数位和结果
while(x)
{
px = px*10+x%10;
ans += x%10;
x /= 10;
}
if(px==xx) // x为回文数
return ans; // 返回数位和
else
return -1;
}
int main()
{
int n;
while(cin>>n)
{
int flag=0; // 设置一个标记,标记是非有符合条件的回文数
for(int i=10000; i<=999999; i++)
{
if(palindrome(i)==n) // i为回文数并且数位和等于输入的n
{
flag=1;
cout<<i<<endl;
}
}
if(flag==0)
cout<<-1<<endl;
}
return 0;
}
キューティーズを読んだ後は、是非気に入ってくださいね、応援よろしくお願いします!
いい加減にして!
共に働く!
Keafmd