[アルゴリズム]白駿4673セルフサービス番号


質問リンク
  • https://www.acmicpc.net/problem/4673
  • 問題の説明
  • 個の正の整数nが与えられると、その数からn、d(n)、d(d(n)、d(d(d(n))、無限数列を生成できます.
  • d(n)=sum(nの各ビット数)=m,
  • nの作成者がmの場合、1から10000までの作成者のない数字が出力されます.
  • テーマ
  • 関数
  • 難易度
  • に答える
    self_number = [True] * 10000
    self_number[0] = False      # 1로 시작하는 숫자와 인덱스를 동일하게 맞추기 위해서 0번째 인덱스는 None으로 처리한다.
    
    for num in range(1, 10000):
        total = num + sum(map(int, str(num)))   # 숫자를 string형으로 변환하여 map을 통해 한 자릿수씩 쪼갠 후 int형으로 다시 바꿔 sum을 구한다.
        if total < 10000:
            self_number[total] = False          # 생성자로 출력된 결과는 False
    
    for i in range(len(self_number)):
        if self_number[i]:          # True 만 반환해준다.
            print(i)
    
    解答方法
  • セルフ番号がTrueの場合、
  • 万個のTrue配列をランダムに生成した.(10000の値を出力する必要がある)
  • 1から10000まで、すべての数字をd(n)に変換します.
  • 3からd(n)に出力された結果は自己符号ではないので、2から生成された配列
    インデックスはFalseに変換されます.
  • 3と4の繰り返し作業が完了すると、最終的にTrueの配列のインデックスとして出力されます.(インデックス値=セルフ・サービス番号)
  • 解答するときに悩むところ
  • 規格では、最後の出力値は9993で、私のコードでは9999まで出力されます.
    なぜこんなことになったのか長い間考えていたところ、次のfor文の条件に問題があることがわかりました.
  • 私が欲しい値は10000以下の総額ですが、次のfor文構造は10000を超えるしかありません.
     * 초기 코드
    for num in range(1, 10000):
        total = num + sum(map(int, str(num)))   
        self_number[total] = False # if문 없음
    次の図に示すように、3行目にif文を追加し、合計が10000の場合にのみ必要な出力値を取得します.
     * 수정 코드 (3번째 줄에 if문이 추가됌)
    for num in range(1, 10000):
        total = num + sum(map(int, str(num)))  
       if total < 10000:		#if 문 추가
       	self_number[total] = False 
    問題を解く心得
  • この問題は先日初めて見たのですが、難しいと思い、スキップしてまた作り直したのですが、やはり難しいですが、今回は大きな壁もなく、全体の枠をつかむことができました.問題は、ifゲートを知るのに3時間もかかったが、結局この問題を解くのに5時間もかかったようだ.
    ああ...これは難易度の問題ですが、これから中学校に行くと大変ですね.
    でも今回の問題は他の問題よりもネットで得られる助けが少ないので、これも勉強だと思います!
    今から次の問題を解きに行きます.