0

よし、机に頭をぶつけて終わりだ。'char's. これが私のプログラムで、その後に実際の出力が続きます。

/*
This program doubles a very large number by using a vector of char types
Usage: program.exe [number]
Output will be 2^[number]
*/

#include <iostream>
#include <vector>
#include <stdlib.h>
using namespace std;

int main(int argc, char *argv[])
{
    vector<char> BigNum;
    BigNum.push_back('2');
    int carry=0, digit;
    int power=atoi(argv[1]);
    power-=1;
    for(int x=0;x<power;x++)                            //Example: going from 16 to 32.  x==4
    {
        for(int y=BigNum.size()-1;y>=0;y--)             //Go from BigNum[1] to BigNum[0] ('6' then '1')
        {
            digit=atoi(&BigNum[y]);                     //digit = 6, then digit=1
            BigNum[y]=(char)(((digit*2+carry)%10)+48);  //BigNum[1]=(char)(6*2+0)%10+48 = '2' in char
                                                        //BigNum[0]=(char)(1*2+1)%10+48 = '3' in char
            carry=digit*2/10;                           //carry=1, then 0
        }
        if(carry==1)                                    //does not execute.  BigNum=={'3','2'}
        {
            BigNum.push_back('0');
            for(int y=BigNum.size()-1;y>0;y--)
            {
                BigNum[y]=BigNum[y-1];
            }
            BigNum[0]='1';
            carry=0;
        }
    }
    for(int x=0;x<BigNum.size();x++) cout<<BigNum[x];
}

以下でコンパイル:

g++ program.cpp -o program

プログラムを実行したときの結果は次のとおりです。

C:\MyApps\program 2
4
C:\MyApps\program 3
8
C:\MyApps\program 4
16

わかりました、これまでのところ良さそうです...「if(carry==1)」セクションでさえ、数値をベクトルの FRONT にプッシュします。続けましょう:

C:\MyApps\program 5
52

何?

C:\MyApps\program 6
26

何何?

C:\MyApps\program 654
84
C:\MyApps\program 654444
00

3 桁になることは決してありません...そして一体何が起こっているのでしょうか?

4

1 に答える 1

2

atoinull で終わる文字列ではないものに適用しています。実際には、メモリ内では null で終わる文字列のように見えるかもしれませんが、実際に見たいものとは異なります。

これを修正する最もクリーンな方法は、ベクトルに ASCII '0'..'9' ではなく、実際の数字の値 0..9 を格納することです。コードもその方が優れていることがわかります。

于 2012-07-10T20:28:12.673 に答える