2倍すると最後尾の数字が先頭に

ある長い数列があり、2倍すると最後尾の数字(8)が先頭に移動します。
元の数列を求めて表示して下さい。

前田稔(Maeda Minoru)の超初心者のプログラム入門

問題の説明

  1. 元の数列(桁数は不明)
    ・・・・・・・・・8

    2倍すると
    8・・・・・・・・・
  2. 元の数列を2倍すると、最下位の桁が8なので積の最下位桁は6になることが解かるでしょう。
    ・・・・・・・・・8
          ×2
    8・・・・・・・・6
  3. 積の最下位桁が6と言う事は、8の隣が6になります。
    ・・・・・・・・68
  4. ・・・68を2倍すると、6の隣は3なります。
    この考え方を繰り返して行くと、やがて答えが求まります。
    ・・・・・・・・68
          ×2
    8・・・・・・・36

プログラムの説明

  1. この問題では「答えが何桁になるか不明」で下位から一桁ずつ求まります。
    また求めた答えは、求めた順とは逆に(先頭から)表示しなければなりません。
    このようなときには vector コンテナを使うのが便利です。
    vector はC++に標準装備されている STL(Standard Template Library) 機能の一部で、配列を拡張したものと思って下さい。
    今までのプログラムに比べて少し違和感があるかと思いますが、慣れると便利なので、これを機会に習得して下さい。
  2. 新規プロジェクトから、空の Console Application を作成して、次のファイルをプロジェクトに加えて下さい。
    /*★ 2倍すると最後尾の数字が先頭に     前田  稔 ★*/
    #include <iostream>
    #include <vector>
    using namespace std;
    
    int main()
    {   vector<short> v;
        short   n,s,c;
        n= 8;
        s=c= 0;
        while(s!=8)
        {   v.push_back(n);
            s= n*2+c;
            n= s%10;
            c= s/10;
        }
        for(n=v.size()-1; n>=0; n--)    cout << v[n];
        cout << endl;
        return 0;
    }
    
  3. printf() で表示することも出来るのですが、STL に合わせて iostream を使ってみました。
    vector を使うときは vector をインクルードして下さい。
    iostream にも vector にも「.h」が付けられていないことに注目して下さい。
    これが新しい仕様のヘッダファイルです。 <(`^´)>
    C++のシステムフォルダーを調べると iostream.h と iostream の両方が格納されています。
    (新しいバージョンでは iostream.h が無くなったようです。)
    using namespace std は名前空間の設定で、修飾しなくても std を参照できるようにします。
    詳細は namespace 宣言 を参照して下さい。
    STL で定義されている標準的な名前は、スコープが std:: として宣言されています。
        #include <iostream>
        #include <vector>
        using namespace std;
        
  4. short 型の vector を宣言します。
        {   vector<short> v;
        
    v の最後尾に一個の領域を確保して n の値を格納します。
            {   v.push_back(n);
        
  5. 現在までに確保された vector の大きさは v.size() で知ることができます。
    n を添え字にして一桁ずつ表示します。
            for(n=v.size()-1; n>=0; n--)    cout << v[n];
        
    C# を使ったプログラムは「超初心者のプログラム入門(C#)/2倍すると最後尾の数字が先頭に」を参照して下さい。
    2倍すると最後尾の数字が先頭に
  6. コマンドプロンプトの画面からコンパイルするときは CLI.BAT を使います。
    CLI.BAT は Set UP から取得して下さい。

【演習】

上のプログラムでは2倍していますが、3倍,4倍,・・・,8倍でも同じように答えを求めることが出来ます。
倍数によって数列の長さが大きく変わるので注意して下さい。
それでは「3倍~8倍」の場合の答えを求めて下さい。
数列が最も長くなるのは何倍のときで、何桁になるでしょう?。

超初心者のプログラム入門(C/C++)