여신을 만나서 내 외모로 마음을 사로잡을 수 있을 것 같아 솔선해서 여신에게 QQ 계정을 요청했는데, 의외로 여신님이 저에게 질문을 주신 것 같았어요. 정말 프로그래머들 사이의 대회였습니다. 주제는 다음과 같습니다.
여신이 일련의 숫자(QQ 숫자가 아님)를 주었습니다. QQ 숫자는 다음 규칙에 따라 찾을 수 있습니다. 먼저 첫 번째 숫자를 삭제한 다음 두 번째 숫자를 숫자 문자열 끝에 있는 이 숫자 문자열에 넣고 세 번째 숫자를 삭제하고 네 번째 숫자를 숫자 문자열 끝에 넣습니다... 이 루프에서는 마지막 숫자가 남을 때까지 다음을 삭제합니다. 마지막 숫자, 지금 삭제 순서를 따르세요. 이 숫자들이 합쳐져 여신의 QQ 번호가 됩니다.
여신이 일련의 숫자 631758924를 주었습니다. 이제 우리가 해야 할 일은 이 숫자에서 여신의 QQ 번호를 알아내는 것입니다. 예를 들어 9개의 카드를 사용하여 이 9를 쓰는 것입니다. 숫자를 각각 계산해서 문제의 진행과정을 시뮬레이션할 수도 있고, 펜을 사용하여 하나씩 계산할 수도 있습니다~~~~
이러한 방법은 너무 낮고 프로그래머의 능력을 보여주지 않습니다. 프로그램을 작성하려고 (사실 다음번에 이런 질문을 하는 여신을 만나면 프로그램이 참 편할 줄 알았는데, 하하~~)
해결책
첫 번째 방법은 수학적 방법을 사용하는 것이고, 질문의 규칙에 따라 다음 작업을 반복합니다: 반올림 =>나머지=>나머지*10+반올림. . . . . 나머지 반올림의 대상은 자릿수에 따라 모두 10의 배수입니다. 각 반올림 후에는 한 자릿수가 있으며 해당 숫자가 0이 될 때까지 루프가 계속됩니다.
$raw_num = 631758924;
$num = 0;
$devisor = 1;
while($devisor
{
$devisor *= 1 0; /raw_num의 10의 배수인 가장 작은 정수를 얻습니다.
}
while ($raw_num > 0) {
$devisor /= 10
$next = Floor($raw_num / $devisor) ; //다음 숫자를 얻습니다
$num = $num*10 + $devisor); //최신 QQ 숫자를 이어붙이기 위해 숫자를 이동합니다
$pre = $raw_num % (ceil($devisor / 10));
$raw_num = $pre * 10 + $last;
}
echo "축하합니다. QQ 번호를 성공적으로 획득했습니다. //축하합니다. QQ 번호: 615947283
QQ 번호를 얻으려면 대기열의 FIFO를 사용하세요. 질문의 특성에 따르면 대기열을 사용하면 간단하고 편리하며 이해하기 쉽습니다.
#include
구조물 대기열 {
int *data;
int head;
int tail()
{
int num , 나;
printf("해독할 QQ 번호의 길이를 입력하세요:");
scanf("%d", &num)
struct queue q; malloc(sizeof (int)*(num*2-1)); //필요한 총 배열 길이는 num*2-1
q.head = 0;
q.tail = 0
(i= 1;i
{
scanf("%d", &q.data[q.tail])
q.tail++;
}
Printf(" 축하합니다. QQ 번호를 성공적으로 획득했습니다: ");
while(q.head
{
q.data[q.tail] = q.data[q.head];
Q. 테일 ++; 해독할 QQ 번호의 길이를 입력하세요: 9
6
... QQ 넘버도 획득했고, 좋은 실력도 보여줬습니다. 이제 여신의 마음 속에서 나의 지위는 크게 향상되었다. 이 방법을 어떻게 배웠나요?