女神と出会い、自分の容姿で彼女の心を掴めると思い、思い切って女神にQQアカウントをお願いしたところ、思いがけず女神から質問が来たようです。実際はプログラマ同士のコンテストで、テーマは次のとおりです:
女神は一連の数字 (QQ 番号ではありません) を与えました。QQ 番号は次のルールに従って見つけることができます。最初に最初の数字を削除し、次に、この数字列の最後に 2 番目の数字を追加し、3 番目の数字を削除し、数字列の最後に 4 番目の数字を追加します...このループでは、最後の数字が残るまで、最後の番号、そして今削除された順序に従うこれらの番号を合わせて女神の QQ 番号です。
以上、女神は 631758924 という数字の列を与えました。私たちが今しなければならないことは、この数字から女神の QQ 番号を見つけることです。たとえば、この 9 つを書くために 9 枚のカードを使用するなど、さまざまな方法があります。それぞれの数値を計算して問題のプロセスをシミュレートすることも、ペンを使用してそれらを 1 つずつ計算することもできます~~~~
これらの方法は低すぎて、プログラマーの能力を示しません。プログラムを書く(実は、今度女神にそんな質問をされたら、とても便利なプログラムになるだろうと思っていました、笑~~~)
解決策
最初の方法は、数学的手法を使用することです。質問のルールに従って、次の操作をループします: Rounding =>Remainder=>Remainder*10+Rounding。 。 。 。 。剰余丸めの対象はすべて 10 の倍数であり、各丸めの桁数に応じて 1 桁になり、数値が 0 になるまでループが継続されます。
$raw_num = 631758924;
$devisor = 1;
while($devisor
$devisor *= 10; / /raw_num の 10 の倍数である最小の整数を取得します
}
while ($raw_num > 0) {
$devisor /= 10
$next = Floor($raw_num / $devisor) ; // 次の番号を取得します
$num = $num*10 + $next; $devisor) // 番号を移動して最新の QQ 番号を結合します
$pre = $devisor / 10));
$raw_num = $pre * 10 + $last;
}
echo "おめでとうございます、QQ 番号を取得しました: {$num}"; QQ 番号: 615947283
QQ 番号を取得するには、キューを使用するのがシンプルで便利で理解しやすいです。
#include
struct queue {
int *data;
int テール;
{
int数字、私。
printf("解読するQQ番号の長さを入力してください:");
scanf("%d", &num);
struct queue q; malloc(sizeof (int)*(num*2-1)); //必要な配列の合計長は num*2-1 です
q.tail = 0; (i= 1;i
{
scanf("%d", &q.data[q.tail]);
q.tail++ }
Printf("おめでとうございます。QQ 番号の取得に成功しました: ");
while (q.head & lt; q.tail) {
Printf ("%d ", q.data [q.head]);
q.head ++;
q.data[q.tail] = q.data[q.head];
q.head++;
;
# 以下は実験です
解読する QQ 番号の長さを入力してください: 9
解読する QQ 番号の長さを入力してください: 9
6
... QQ番号を取得し、優れたスキルも示しました。これで女神の御心における私のステータスは大きく向上しました。 この方法を学びましたか?