C++ C++;十六进制乘法计算器

C++ C++;十六进制乘法计算器,c++,calculator,multiplication,C++,Calculator,Multiplication,我遇到的问题是,我的乘法方法只处理一行,目前无法前进到下一行。add函数工作正常,我可以更新当前的十六进制数,但由于某些原因,我只能得到一行乘法 Example input: 111# * 333# = 333 123# * 123# = 369 以下是相关代码: LList* Calculator::multiply(LList& left, LList& right) { int product, carry = 0, lval = 0, rval = 0,

我遇到的问题是,我的乘法方法只处理一行,目前无法前进到下一行。add函数工作正常,我可以更新当前的十六进制数,但由于某些原因,我只能得到一行乘法

Example input:
111# * 333# = 333
123# * 123# = 369
以下是相关代码:

    LList* Calculator::multiply(LList& left, LList& right) {
    int product, carry = 0, lval = 0, rval = 0, zeros = 0;
    bool calculating = true;
    listnode *leftNode;
    vector <LList*> addList;
    listnode *rightNode;
    LList* newHex;
    while(calculating) {

        leftNode = left.next();
        if(leftNode == NULL) {
            break;
        }
        else {
            lval = leftNode->data;
        }


        //leftNode = left.next();
        right.reset();

        if(leftNode == NULL) {
            calculating = false;
            if(carry != 0) {
                //newHex->insertTail(carry);
            }
            lval = 0;
            break;
        }

        LList* curList = new LList;
        addList.push_back(curList);

        while(rightNode != NULL) {

            // Add however zeros we need for
            // each entry based on the zero counter
            for(int i = 0; i < zeros; i++) {
                curList->insertTail(0);
            }

            rightNode = right.next();


            if(rightNode == NULL) {

            } 
            else {
            rval = rightNode->data;

            product = lval * rval + carry;
            carry = 0;
            if(product >= 16) {
                carry = (product / 16);
                product = (product % 16);
            }
            curList->insertTail(product);
            }
        }
        zeros++;


    }

    Calculator calc;
    LList* temp;
    // Add up everything in the addList
    for(int i = 0; i < addList.size() - 1; i++) {
        if(temp == NULL)
            temp = calc.add(*addList[i], *addList[i+1]);
        else
            temp = calc.add(*addList[i+1], *temp);
    }

    newHex = temp;

    // Delete it
    for(int i = 0; i < addList.size(); i++) {

    }

    return newHex;
};
完整程序:

#include <iostream>
#include <vector>
#include <stdlib.h>
#include <string>
using namespace std;
#undef NULL
const int NULL = 0;
const char SENTINEL = '#';
typedef int element;

class listnode {
    public:
        element data;
        listnode * next;
};

class LList {
    private:
        listnode * head;
        listnode * tail;
        listnode * view;

    public:
        LList();
        ~LList();
        void read();
        listnode* next();
        void reset();
        void print();
        void insertTail(element val);
        void clean();

        element deleteHead();
};

class Calculator {
    public:
        Calculator();
        inline LList* add(LList& left, LList& right);
        inline LList* multiply(LList& left, LList& right);
};

Calculator::Calculator() {

};

LList* Calculator::add(LList& left, LList& right) {
    int sum, carry = 0, lval = 0, rval = 0;
    bool calculating = true;
    listnode *leftNode;
    listnode *rightNode;
    LList* newHex = new LList;
    while(calculating) {
        leftNode = left.next();
        rightNode = right.next();

        if(leftNode == NULL) {
            lval = 0;
        }
        else
            lval = leftNode->data;

        if(rightNode == NULL) {
            rval = 0;
        }
        else
            rval = rightNode->data;


        if(leftNode == NULL && rightNode == NULL) {
            calculating = false;
            if(carry != 0) {
                newHex->insertTail(carry);
            }
            break;
        }

        sum = lval + rval + carry;
        carry = 0;
        if(sum >= 16) {
            carry = 1;
            sum -= 16;
        }

        newHex->insertTail(sum);

    }

    return newHex;
};


LList* Calculator::multiply(LList& left, LList& right) {
    int product, carry = 0, lval = 0, rval = 0, zeros = 0;
    bool calculating = true;
    listnode *leftNode;
    vector <LList*> addList;
    listnode *rightNode;
    LList* newHex;
    while(calculating) {

        leftNode = left.next();
        if(leftNode == NULL) {
            break;
        }
        else {
            lval = leftNode->data;
        }


        //leftNode = left.next();
        right.reset();

        if(leftNode == NULL) {
            calculating = false;
            if(carry != 0) {
                //newHex->insertTail(carry);
            }
            lval = 0;
            break;
        }

        LList* curList = new LList;
        addList.push_back(curList);

        while(rightNode != NULL) {

            // Add however zeros we need for
            // each entry based on the zero counter
            for(int i = 0; i < zeros; i++) {
                curList->insertTail(0);
            }

            rightNode = right.next();


            if(rightNode == NULL) {

            } 
            else {
            rval = rightNode->data;

            product = lval * rval + carry;
            carry = 0;
            if(product >= 16) {
                carry = (product / 16);
                product = (product % 16);
            }
            curList->insertTail(product);
            }
        }
        zeros++;


    }



    Calculator calc;
    LList* temp;
    // Add up everything in the addList
    for(int i = 0; i < addList.size() - 1; i++) {
        if(temp == NULL)
            temp = calc.add(*addList[i], *addList[i+1]);
        else
            temp = calc.add(*addList[i+1], *temp);
    }

    newHex = temp;

    // Delete it
    for(int i = 0; i < addList.size(); i++) {

    }

    return newHex;
};

listnode* LList::next() {
    listnode* temp = view;
    if(temp != NULL)
        view = view->next;

    if(view == NULL) {
    }
    return temp;
};

void LList::reset() {
    view = head;
}


LList::LList(){
    /*
    next:
    This is used to set the linked
    list to NULL.
    */
    head = NULL;
    view = NULL;
};


void LList::print() {
    listnode * temp;
    int i = 0;
    string printValues;
    temp = head;
    while(temp != NULL) {
        int var = temp -> data;
        char character = ' ';
        if(i % 3 == 0 && i != 0)
            printValues += ',';
        i++;    
        if(var > 9 && var < 16) {
            character = static_cast <char>(var + 65 - 10);
        };
        if (var <= 9 && var >= 0) {
            character = static_cast <char>(var + 48);
        };
        if (var > 96 && var < 103) {
            character = static_cast <char>(var + 97 + 10);
        };

        printValues += character;
        temp = temp -> next;

    }
    string tempValues;
    for(int i = printValues.length() - 1; i >= 0; i--)
        tempValues += printValues[i];
    cout << tempValues;
    cout << endl;
};

 void LList::read() {
    string userval;
    int i;
    bool parsing = true;
    char curval;
    vector <int> values;
    clean();
    while(parsing) {
        cin >> userval;
        for(unsigned int i = 0; i < userval.length(); i++) {
            curval = userval[i];    
            if(curval >= 48 && curval <= 57)
                values.push_back(static_cast <int>(curval - 
            48));

            if(curval >= 65 && curval <= 70)
                values.push_back(static_cast <int>(curval - 
            65 + 10));

            if(curval >= 97 && curval <= 102)
                values.push_back(static_cast <int>(curval - 
            97 + 10)); 

            if(curval == ' ')
                break;

            if(curval == SENTINEL) {
                parsing = false;
                break;
            }   
        }
    }
    for(int i = values.size() -1; i >= 0; i--) {
        insertTail(values[i]);
    }
}; 

void LList::insertTail(element val) {
    listnode * temp;
    temp = new listnode;
    temp -> data = val;
    temp -> next = NULL;

    if(head == NULL) {
        head = temp;
        view = head;
    }
    else
        tail -> next = temp;
    tail = temp;
};

void LList::clean() {
    while(head != NULL)
        deleteHead();
};

void validCommands() {
    cout << "Valid commands are:" << endl;
    cout << "  e enter  enter the current ";
    cout << "hexadecimal ";
    cout << "number from the keyboard" << endl;
    cout << "  a add        add a new hexadecimal ";
    cout << "number to the current hex. number" << endl;
    cout << "  m multiply   ";
    cout << "multiply a new hexadecimal number ";
    cout << "by the current hex. number" << endl;
    cout << "  h help   show this help menu" << endl;
    cout << "  q quit   quit the program" << endl << endl;
};

element LList::deleteHead() {
    listnode * temp;
    temp = head;
    head = head -> next;
    delete temp;
    return temp -> data;
};

LList::~LList(){
    delete head;
};

int main() {
    LList L, add,multiply;
    Calculator calc;
    L.insertTail(0);
    char option;
    bool run;
    cout << "Hexadecimal Calculator, Ver 1.0.0 \n";



    do {
        /*
    This do while is used to continuosly run the 
    program until the user decides to end.
    */
    cout << "Current Hexadecimal number is: ";
    L.print();
    cout << endl;

    cout << "Command (h for help): ";
    cin >> option;

    cout << endl << endl;
        switch(option) {
            case 'e' : 
                cout << "Enter a hexadecimal number ";
                cout << "followed by #: ";
                L.read();
                cout << endl << "Entering completed.";
                cout << endl << endl;
            break;
            case 'a' :  
                cout << "Adding a new hexadecimal number ";
                cout << "to the current hex. number" << endl;
                cout << endl;
                cout << "Enter a hexadecimal ";
                cout << "number, follow by #: ";
                add.read();
                cout << endl << "Addition completed.";
                cout << endl;
                L = *calc.add(L, add);
                cout << endl;
                break;
            case 'm' : 
                cout << "Multiplying a new hexadecimal ";
                cout << "number ";
                cout << "to the current hex. number" << endl;
                cout << endl;
                cout << "Enter a hexadecimal ";
                cout << "number, follow by #: ";
                multiply.read();
                cout << endl << "Multiplication completed.";
                cout << endl;
                L = *calc.multiply(L, multiply);
                cout << endl;
                break;
            case 'h' : validCommands();
            break;
            case 'q' : run = false;
            break;
        };
    } while (run);
        exit(0);

}
#包括
#包括
#包括
#包括
使用名称空间std;
#未定义空值
常数int NULL=0;
const char SENTINEL='#';
typedef int元素;
类listnode{
公众:
元素数据;
listnode*下一步;
};
类利斯特{
私人:
listnode*头;
listnode*尾部;
listnode*视图;
公众:
李斯特();
~LList();
无效读取();
listnode*next();
无效重置();
作废打印();
void insertTail(元素val);
无效清除();
元素deleteHead();
};
类计算器{
公众:
计算器();
内联LList*添加(LList和左、LList和右);
内联LList*乘法(LList和左、LList和右);
};
计算器::计算器(){
};
LList*计算器::添加(LList&左、LList&右){
整数和,进位=0,lval=0,rval=0;
布尔计算=真;
listnode*leftNode;
listnode*rightNode;
LList*newHex=新的LList;
同时(计算){
leftNode=left.next();
rightNode=right.next();
if(leftNode==NULL){
lval=0;
}
其他的
lval=leftNode->data;
if(rightNode==NULL){
rval=0;
}
其他的
rval=右节点->数据;
if(leftNode==NULL&&rightNode==NULL){
计算=假;
如果(进位!=0){
newHex->insertTail(进位);
}
打破
}
总和=左心室+右心室+进位;
进位=0;
如果(总和>=16){
进位=1;
总和-=16;
}
newHex->insertTail(总和);
}
返回newHex;
};
LList*计算器::乘法(LList&左、LList&右){
整数乘积,进位=0,lval=0,rval=0,零=0;
布尔计算=真;
listnode*leftNode;
矢量地址表;
listnode*rightNode;
利斯特*newHex;
同时(计算){
leftNode=left.next();
if(leftNode==NULL){
打破
}
否则{
lval=leftNode->data;
}
//leftNode=left.next();
对。重置();
if(leftNode==NULL){
计算=假;
如果(进位!=0){
//newHex->insertTail(进位);
}
lval=0;
打破
}
LList*卷发器=新的LList;
addList.push_back(卷发器);
while(rightNode!=NULL){
//加上我们需要的零
//每个条目都基于零计数器
对于(int i=0;i<0;i++){
卷发器->插入尾巴(0);
}
rightNode=right.next();
if(rightNode==NULL){
} 
否则{
rval=右节点->数据;
产品=lval*rval+进货;
进位=0;
如果(产品>=16){
进位=(产品/16);
产品=(产品%16);
}
卷发器->插入尾巴(产品);
}
}
零++;
}
计算器计算器;
利斯特*温度;
//把地址列表中的所有内容都加起来
对于(int i=0;i下一步;
如果(视图==NULL){
}
返回温度;
};
void LList::reset(){
视图=头部;
}
LList::LList(){
/*
下一步:
这用于设置链接的
将列表设置为空。
*/
head=NULL;
视图=空;
};
void LList::print(){
listnode*temp;
int i=0;
字符串打印值;
温度=水头;
while(temp!=NULL){
int var=temp->data;
字符='';
如果(i%3==0&&i!=0)
打印值+=',';
i++;
如果(var>9&&var<16){
字符=静态施法(var+65-10);
};
如果(var=0){
字符=static_cast(var+48);
};
如果(var>96&&var<103){
字符=静态施法(var+97+10);
};
打印值+=字符;
温度=温度->下一步;
}
字符串值;
对于(int i=printValues.length()-1;i>=0;i--)
tempValues+=打印值[i];
coutuserval;
for(无符号int i=0;i=48&&curval=65&&curval=97&&curval=0;i--){
插入尾(值[i]);
}
}; 
void LList::insertTail(元素val){
listnode*temp;
temp=新的列表节点;
温度->数据=val;
temp->next=NULL;
if(head==NULL){
压头=温度;
视图=头部;
}
其他的
尾部->下一步=温度;
尾=温度;
};
void-LList::clean(){
while(head!=NULL)
deleteHead();
};
无效有效命令(){

coutwhile(rightNode!=NULL)
的第一次求值使用了
rightNode
的未初始化值,当您运行程序时,该值恰好为非NULL。在该检查之后,在解除引用之前,
rightNode
被设置为
right.next()中的有效节点指针值
。但是对于下一个左数字,rightnode仍然是上一个循环中的NULL,因为它在
right.reset()之后不会更新,因此对于f之后的每个数字
#include <iostream>
#include <vector>
#include <stdlib.h>
#include <string>
using namespace std;
#undef NULL
const int NULL = 0;
const char SENTINEL = '#';
typedef int element;

class listnode {
    public:
        element data;
        listnode * next;
};

class LList {
    private:
        listnode * head;
        listnode * tail;
        listnode * view;

    public:
        LList();
        ~LList();
        void read();
        listnode* next();
        void reset();
        void print();
        void insertTail(element val);
        void clean();

        element deleteHead();
};

class Calculator {
    public:
        Calculator();
        inline LList* add(LList& left, LList& right);
        inline LList* multiply(LList& left, LList& right);
};

Calculator::Calculator() {

};

LList* Calculator::add(LList& left, LList& right) {
    int sum, carry = 0, lval = 0, rval = 0;
    bool calculating = true;
    listnode *leftNode;
    listnode *rightNode;
    LList* newHex = new LList;
    while(calculating) {
        leftNode = left.next();
        rightNode = right.next();

        if(leftNode == NULL) {
            lval = 0;
        }
        else
            lval = leftNode->data;

        if(rightNode == NULL) {
            rval = 0;
        }
        else
            rval = rightNode->data;


        if(leftNode == NULL && rightNode == NULL) {
            calculating = false;
            if(carry != 0) {
                newHex->insertTail(carry);
            }
            break;
        }

        sum = lval + rval + carry;
        carry = 0;
        if(sum >= 16) {
            carry = 1;
            sum -= 16;
        }

        newHex->insertTail(sum);

    }

    return newHex;
};


LList* Calculator::multiply(LList& left, LList& right) {
    int product, carry = 0, lval = 0, rval = 0, zeros = 0;
    bool calculating = true;
    listnode *leftNode;
    vector <LList*> addList;
    listnode *rightNode;
    LList* newHex;
    while(calculating) {

        leftNode = left.next();
        if(leftNode == NULL) {
            break;
        }
        else {
            lval = leftNode->data;
        }


        //leftNode = left.next();
        right.reset();

        if(leftNode == NULL) {
            calculating = false;
            if(carry != 0) {
                //newHex->insertTail(carry);
            }
            lval = 0;
            break;
        }

        LList* curList = new LList;
        addList.push_back(curList);

        while(rightNode != NULL) {

            // Add however zeros we need for
            // each entry based on the zero counter
            for(int i = 0; i < zeros; i++) {
                curList->insertTail(0);
            }

            rightNode = right.next();


            if(rightNode == NULL) {

            } 
            else {
            rval = rightNode->data;

            product = lval * rval + carry;
            carry = 0;
            if(product >= 16) {
                carry = (product / 16);
                product = (product % 16);
            }
            curList->insertTail(product);
            }
        }
        zeros++;


    }



    Calculator calc;
    LList* temp;
    // Add up everything in the addList
    for(int i = 0; i < addList.size() - 1; i++) {
        if(temp == NULL)
            temp = calc.add(*addList[i], *addList[i+1]);
        else
            temp = calc.add(*addList[i+1], *temp);
    }

    newHex = temp;

    // Delete it
    for(int i = 0; i < addList.size(); i++) {

    }

    return newHex;
};

listnode* LList::next() {
    listnode* temp = view;
    if(temp != NULL)
        view = view->next;

    if(view == NULL) {
    }
    return temp;
};

void LList::reset() {
    view = head;
}


LList::LList(){
    /*
    next:
    This is used to set the linked
    list to NULL.
    */
    head = NULL;
    view = NULL;
};


void LList::print() {
    listnode * temp;
    int i = 0;
    string printValues;
    temp = head;
    while(temp != NULL) {
        int var = temp -> data;
        char character = ' ';
        if(i % 3 == 0 && i != 0)
            printValues += ',';
        i++;    
        if(var > 9 && var < 16) {
            character = static_cast <char>(var + 65 - 10);
        };
        if (var <= 9 && var >= 0) {
            character = static_cast <char>(var + 48);
        };
        if (var > 96 && var < 103) {
            character = static_cast <char>(var + 97 + 10);
        };

        printValues += character;
        temp = temp -> next;

    }
    string tempValues;
    for(int i = printValues.length() - 1; i >= 0; i--)
        tempValues += printValues[i];
    cout << tempValues;
    cout << endl;
};

 void LList::read() {
    string userval;
    int i;
    bool parsing = true;
    char curval;
    vector <int> values;
    clean();
    while(parsing) {
        cin >> userval;
        for(unsigned int i = 0; i < userval.length(); i++) {
            curval = userval[i];    
            if(curval >= 48 && curval <= 57)
                values.push_back(static_cast <int>(curval - 
            48));

            if(curval >= 65 && curval <= 70)
                values.push_back(static_cast <int>(curval - 
            65 + 10));

            if(curval >= 97 && curval <= 102)
                values.push_back(static_cast <int>(curval - 
            97 + 10)); 

            if(curval == ' ')
                break;

            if(curval == SENTINEL) {
                parsing = false;
                break;
            }   
        }
    }
    for(int i = values.size() -1; i >= 0; i--) {
        insertTail(values[i]);
    }
}; 

void LList::insertTail(element val) {
    listnode * temp;
    temp = new listnode;
    temp -> data = val;
    temp -> next = NULL;

    if(head == NULL) {
        head = temp;
        view = head;
    }
    else
        tail -> next = temp;
    tail = temp;
};

void LList::clean() {
    while(head != NULL)
        deleteHead();
};

void validCommands() {
    cout << "Valid commands are:" << endl;
    cout << "  e enter  enter the current ";
    cout << "hexadecimal ";
    cout << "number from the keyboard" << endl;
    cout << "  a add        add a new hexadecimal ";
    cout << "number to the current hex. number" << endl;
    cout << "  m multiply   ";
    cout << "multiply a new hexadecimal number ";
    cout << "by the current hex. number" << endl;
    cout << "  h help   show this help menu" << endl;
    cout << "  q quit   quit the program" << endl << endl;
};

element LList::deleteHead() {
    listnode * temp;
    temp = head;
    head = head -> next;
    delete temp;
    return temp -> data;
};

LList::~LList(){
    delete head;
};

int main() {
    LList L, add,multiply;
    Calculator calc;
    L.insertTail(0);
    char option;
    bool run;
    cout << "Hexadecimal Calculator, Ver 1.0.0 \n";



    do {
        /*
    This do while is used to continuosly run the 
    program until the user decides to end.
    */
    cout << "Current Hexadecimal number is: ";
    L.print();
    cout << endl;

    cout << "Command (h for help): ";
    cin >> option;

    cout << endl << endl;
        switch(option) {
            case 'e' : 
                cout << "Enter a hexadecimal number ";
                cout << "followed by #: ";
                L.read();
                cout << endl << "Entering completed.";
                cout << endl << endl;
            break;
            case 'a' :  
                cout << "Adding a new hexadecimal number ";
                cout << "to the current hex. number" << endl;
                cout << endl;
                cout << "Enter a hexadecimal ";
                cout << "number, follow by #: ";
                add.read();
                cout << endl << "Addition completed.";
                cout << endl;
                L = *calc.add(L, add);
                cout << endl;
                break;
            case 'm' : 
                cout << "Multiplying a new hexadecimal ";
                cout << "number ";
                cout << "to the current hex. number" << endl;
                cout << endl;
                cout << "Enter a hexadecimal ";
                cout << "number, follow by #: ";
                multiply.read();
                cout << endl << "Multiplication completed.";
                cout << endl;
                L = *calc.multiply(L, multiply);
                cout << endl;
                break;
            case 'h' : validCommands();
            break;
            case 'q' : run = false;
            break;
        };
    } while (run);
        exit(0);

}
#include <iostream>
#include <string>
#include <vector>

struct listnode {
    int data;
    listnode *next;
    listnode(int data=0) : data(data), next(0) {}
};

class LList {
    listnode *head, *tail;  // head is least significant end
    void delNodes() {
        listnode* node = head;
        while(node) {
            listnode* todel = node;
            node = node->next;
            delete todel;
        }
        head = tail = 0;
    }
public:
    LList() : head(0), tail(0) {}
    LList(std::string digits) : head(0), tail(0) {
        for(auto it = digits.rbegin(); it != digits.rend(); ++it) {
            if(*it >= '0' && *it <= '9') insertTail(*it - '0');
            else if(*it >= 'a' && *it <= 'f') insertTail(*it - 'a' + 10);
            else if(*it >= 'A' && *it <= 'F') insertTail(*it - 'A' + 10);
    }   }
    LList(const LList& src) : head(0), tail(0) {
        for(int data : src) { insertTail(data); }
    }
    ~LList() { delNodes(); }
    LList& operator = (const LList& src) {
        delNodes();
        for(int data : src) { insertTail(data); }
        return *this;
    }
    void insertTail(int value) {
        listnode *newnode = new listnode(value);
        if(!head) {
            head = tail = newnode;
        } else {
            tail->next = newnode;
            tail = newnode;
    }   }
    class iterator {
        friend LList;
        const listnode* node;
        iterator(const listnode* node) : node(node) {}
    public:
        iterator& operator ++ () { if(node) node = node->next; return *this; }
        int operator * () const { return node ? node->data : 0; }
        bool operator != (iterator iter) const { return iter.node != node; }
        bool operator == (iterator iter) const { return iter.node == node; }
    };
    iterator begin() const { return iterator(head); }
    iterator end()   const { return iterator(0); }
    std::string get_digits() const {
        static const char da[] = "0123456789abcdef";
        std::string digits;
        for(int d : *this) {
            digits = da[d] + digits;
        }
        return digits;
    }
};

LList add(const LList& left, const LList& right) {
    LList sum;
    auto liter = left.begin();
    auto riter = right.begin();
    int carry = 0;
    while(liter != left.end() || riter != right.end()) {
        int s = *liter + *riter + carry;
        carry = s / 16;
        sum.insertTail(s % 16);
        ++liter;
        ++riter;
    }
    if(carry) sum.insertTail(carry);
    return sum;
}

LList multiply(const LList& left, const LList& right) {
    LList prodSum;
    auto leftNode = left.begin();
    int zeros = 0;
    for(;;) {
        if(leftNode == left.end()) break;
        int lval = *leftNode;
        LList curList;
        for(int i = 0; i < zeros; i++) {
            curList.insertTail(0);
        }
        auto rightNode = right.begin();
        int carry = 0;
        while(rightNode != right.end()) {
            int rval = *rightNode;
            int product = lval * rval + carry;
            carry = product / 16;
            product %= 16;
            curList.insertTail(product);
            ++rightNode;
        }
        while(carry) {
            curList.insertTail(carry % 16);
            carry /= 16;
        }
        prodSum = add(prodSum, curList);
        ++leftNode;
        ++zeros;
    }

    return prodSum;
}

int main() {
    LList a("111");
    LList b("333");
    LList c = multiply(a, b);  // 36963
    std::cout << c.get_digits() << '\n';
}