paizaの新作プログラミングゲーム【電脳少女プログラミング2088 ─壊レタ君を再構築─】廃マンションの一室(paizaランク:C相当)をやってみました。
問題
方針
- 整数$N$を受け取ります
- 配列$A=(a_i)$を作成します(入出力例2より、12桁あれば十分です)
- $i=0$とします
- 以下、繰り返します
- $r=N\%3$とします(言語によっては負の値になります)
- $r=0$の場合
- $a_i=0$とします
- $r=1,-2$の場合
- $a_i=1$とします
- $N$から$1$引きます
- $r=2,-1$の場合
- $a_i=2$とします
- $N$に$1$足します
- $r=0$の場合
- $N$を$3$で割ります(この時点で$N$は$3$の倍数であることが保証されています)
- $i$に$1$足します
- $N=0$になったら、繰り返しを抜けます
- $r=N\%3$とします(言語によっては負の値になります)
- 配列$A$を逆順に出力し、最後に改行を出力します
- 以下のコードでは、負の剰余も正の剰余となるようにしています
- 上の方針では余りによって3通りに分けていますが、実は$r=2, -1$とそれ以外の場合に分ければ十分です
- 前判定ループ(
while(){}
)を使うと$N=0$の場合に何も表示されなくなりますので、後判定ループ(do{}while();
)を用います- 後判定ループの無い言語では、最初に$N=0$のケースを処理しています
C
#include <stdio.h>
int main() {
int n;
scanf("%d", &n);
int A[12];
int m = 0;
do {
int r = (n % 3 + 3) % 3;
A[m++] = r;
if (r == 2) n += 1; else n -= r;
n /= 3;
} while (n);
while (m--) {
printf("%d", A[m]);
}
puts("");
return 0;
}
C++
#include <iostream>
#include <vector>
using namespace std;
int main() {
int n;
cin >> n;
vector<int> A;
do {
int r = (n % 3 + 3) % 3;
A.push_back(r);
if (r == 2) n += 1; else n -= r;
n /= 3;
} while (n);
while (!A.empty()) {
cout << A.back();
A.pop_back();
}
cout << endl;
return 0;
}
C#
using System;
using System.Collections.Generic;
class Program
{
public static void Main()
{
int n = int.Parse(Console.ReadLine());
Stack<int> stack = new Stack<int>();
do {
int r = (n % 3 + 3) % 3;
stack.Push(r);
if (r == 2) n += 1; else n -= r;
n /= 3;
} while (n != 0);
while (stack.Count > 0)
System.Console.Write(stack.Pop());
Console.WriteLine();
}
}
Go
package main
import "fmt"
func main() {
var n int
fmt.Scan(&n)
A := []int{}
if n == 0 {
A = append(A, 0)
}
for n != 0 {
r := (n % 3 + 3) % 3
A = append(A, r)
if r == 2 {
n += 1
} else {
n -= r
}
n /= 3
}
for i := len(A) - 1; i >= 0; i-- {
fmt.Print(A[i])
}
fmt.Println()
}
Java
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
sc.close();
Stack<Integer> stack = new Stack<Integer>();
do {
int r = (n % 3 + 3) % 3;
stack.push(r);
if (r == 2) n += 1; else n -= r;
n /= 3;
} while (n != 0);
while (!stack.empty()) {
System.out.print(stack.pop());
}
System.out.println();
}
}
JavaScript
let n = Number(require("fs").readFileSync("/dev/stdin", "utf8"));
const A = []
do {
let r = (n % 3 + 3) % 3;
A.push(r);
if (r === 2) n += 1; else n -= r;
n /= 3;
} while (n);
console.log(A.reverse().map(String).join(''));
Kotlin
import java.util.*
fun main() {
val sc = Scanner(System.`in`)
var n = sc.nextInt()
sc.close()
val stack = Stack<Int>()
do {
val r = (n % 3 + 3) % 3
stack.push(r)
if (r == 2) n += 1 else n -= r
n /= 3
} while (n != 0)
while (!stack.empty()) {
print(stack.pop())
}
println()
}
PHP
<?php
$n = intval(fgets(STDIN));
$A = [];
do {
$r = ($n % 3 + 3) % 3;
$A[] = $r;
if ($r === 2) $n += 1; else $n -= $r;
$n /= 3;
} while ($n);
while (!empty($A)) {
echo array_pop($A);
}
echo PHP_EOL;
?>
Perl
my $n = int(<STDIN>);
my @A = ();
do {
my $r = $n % 3;
push @A, $r;
if ($r == 2) {
$n += 1;
} else {
$n -= $r;
}
$n /= 3;
} while ($n);
while (@A) {
print pop @A;
}
print $/;
Python3
n = int(input())
A = []
if n == 0:
A.append(0)
while n:
r = n % 3
A.append(r)
if r == 2:
n += 1
else:
n -= r
n //= 3
print(''.join(map(str, reversed(A))))
Ruby
n = gets.to_i
A = []
if n == 0
A.push(0)
end
while n != 0
r = n % 3
A.push(r)
if r == 2
n += 1
else
n -= r
end
n /= 3
end
puts A.reverse.join
Scala
import scala.io.StdIn._
import scala.collection.mutable._
object Main extends App{
var n = readInt()
val stack = Stack[Int]()
do {
val r = (n % 3 + 3) % 3
stack.push(r)
if (r == 2) n += 1 else n -= r
n /= 3
} while (n != 0)
while (stack.nonEmpty) {
print(stack.pop())
}
println()
}
Swift
var n = Int(readLine()!)!
var A = [Int]()
repeat {
let r = (n % 3 + 3) % 3
A.append(r)
if r == 2 {
n += 1
} else {
n -= r
}
n /= 3
} while n != 0
print(A.reversed().map { String($0) }.joined())