10進数が7で割り切れるかどうかを確認するには:
最後の桁を消去します。2で乗算し、残っているものから減算します。結果が7で割り切れる場合、元の数は7で割り切れます。
このルールは、手動の分割可能性チェックに適しています。例えば:
2016年は7で割り切れますか?
6*2
201から減算します。189になります。これは7で割り切れますか?それを確認するために、もう一度ルールを適用しましょう。
9*2
18を引きます。したがって、2016は7で割り切れます。
このチャレンジでは、分割可能ステータスが明白になるまで、つまり、数が70以下になるまでこのルールを適用する必要があります(ただし、詳細については以下を参照してください)。関数または完全なプログラムを作成します。
入力:正の整数。コードは最大32767の入力をサポートする必要があります(任意精度の整数をサポートすることはボーナスです。以下を参照)。
出力:整数(おそらく負)、70以下。これは、7回の可分性ルールを0回以上適用した結果です。
テストケース:
Input Output Alternative output
1 1
10 10 1
100 10 1
13 13 -5
42 42 0
2016 0
9 9
99 -9
9999 -3
12345 3
32767 28 -14
---------- Values below are only relevant for the bonus
700168844221 70 7
36893488147419103232 32 -1
231584178474632390847141970017375815706539969331281128078915168015826259279872 8
2つの可能な出力が指定されている場合、どちらかの結果は正しいです。2番目の出力は、ルールをもう一度適用することに対応します。1桁の数字にルールを適用することは禁止されています。数字を消去すると、何も(0ではなく)残ります。
ボーナス:アルゴリズム
- 任意精度の整数をサポート
- 入力に対して1つのパスのみを実行します
- スペースが複雑です
o(n)
(つまり、未満O(n)
)。そして - 時間の複雑さ
O(n)
、
ここn
で、10進数の桁数は次のとおりです。
コードのバイトカウントから50%を引きます。
リアルボーナス:
さらに、アルゴリズムが最上位桁から開始して通常の方向で入力を読み取る場合、もう一度50%を引きます-スコアはバイトカウントの25%です(可能性があるようですが、確かではありません)。
1000000000000000000001
。
long long
sまたは同等のタイプが組み込まれている場合はどうでしょうか?