Помогите написать класс для перемножения 40-значных чисел.

В классе должны быть предусмотрены следующие методы:
-метод для вывода 40-значного числа на экран
-метод для ввода 40-значного числа с экрана
-переопределенный оператор * для перемножения

Почему я всё чаще «помогите написать» читаю как «напишите за меня»?

Я так написал потому что мне было ваше мнение

Алексей, так выложи свой код и попроси чтобы высказали о нем свое мнение.

Вот код, но он складывает, а не перемножает:

#include<iostream>
#include<math.h>
using namespace std;
class loooong_int {
public:
    char a[40];

    int d[5000], c[5000];
    void Home(loooong_int, loooong_int);
};
void main() {
    setlocale(0, "");
    loooong_int A, B;

    int b[5000];
    cout<<"Pervoe+Vtoroe=:"<<endl;
    A.Home(A, B);

    cout<<endl;

    system("pause");
}
void loooong_int::Home(loooong_int a, loooong_int b) {
    cout<<"#1"<<endl;
    cin >> a.a;
    cout<<"#2"<<endl;
    cin >> b.a;
    cout<<"Otvet:"<<endl;
    for (int i = 0; i < 5000; i++) {
        a.d[i] = 0; a.c[i] = 0; b.c[i] = 0;
    }

    int i = 0;
    int j = 0;
    for (; a.a[i] != '\0'; i++);
    for (; b.a[j] != '\0'; j++);

    int p = 0;
    for (int k = i - 1; k >= 0; k--) {

        a.c[p] = a.a[k] - 48;
        p++;
    }
    p = 0;
    for (int k = j - 1; k >= 0; k--) {

        b.c[p] = b.a[k] - 48;
        p++;
    }

    for (int j2 = 0; j2 < 4999; j2++) {
        if (a.c[j2] + b.c[j2]+a.d[j2] >=10) {

            a.d[j2 + 1] += (a.c[j2] + b.c[j2]+a.d[j2]) / 10;
            a.d[j2] = (a.c[j2] + b.c[j2]+a.d[j2]) % 10;}

        else a.d[j2] += a.c[j2] + b.c[j2];}
    bool c = true;
    for (int i = 4999; i >= 0; i--) {
        if (a.d[i] == 0 && c == true)continue;
        else c = false;
        cout <<  a.d[i];}}

По примеру товарищей, попытался абстрагироваться от ужаса этого кода — получилось нечто, которое перемножает. Полную правильность решения не гарантирую: ловить блох в этом месиве — это вы уж сами.

void loooong_int::Home(loooong_int a, loooong_int b) {
    cout << "#1" << endl;
    cin >> a.a;
    cout << "#2" << endl;
    cin >> b.a;
    cout << "Otvet:" << endl;
    for (int i = 0; i < 5000; i++) {
        a.d[i] = 0; a.c[i] = 0; b.c[i] = 0;
    }

    int i = 0;
    int j = 0;
    for (; a.a[i] != '\0'; i++);
    for (; b.a[j] != '\0'; j++);

    int p = 0;
    for (int k = i - 1; k >= 0; k--) {

        a.c[p] = a.a[k] - 48;
        p++;
    }
    p = 0;
    for (int k = j - 1; k >= 0; k--) {

        b.c[p] = b.a[k] - 48;
        p++;
    }
    for (int j1 = i - 1; j1 >= 0; j1--) {
        for (int j2 = 0; j2 < 4999; j2++) {
            int part = a.c[j1] * b.c[j2] + a.d[j2];
            if (part >= 10) {
                a.d[j2 + 1] += part / 10;
                a.d[j2] = part % 10;
            }
            else
                a.d[j2] = part;
        }
        if (j1 > 0) {
            for (int j3 = 4998; j3 >= 0; --j3) {
                a.d[j3 + 1] = a.d[j3];
            }
            a.d[0] = 0;
        }
    }
    bool c = true;
    for (int i = 4999; i >= 0; i--) {
        if (a.d[i] == 0 && c == true)continue;
        else c = false;
        cout << a.d[i];
    }
}

Только, Алексей, ваша программа (даже подправленная) не соответствует заданию.

В классе должны быть предусмотрены следующие методы:
-метод для вывода 40-значного числа на экран
-метод для ввода 40-значного числа с экрана
-переопределенный оператор * для перемножения

Класс, формально, присутствует. Хотя фактически это непонятно даже что.

Методы (2 штуки) для ввода и вывода числа где?
Переопределенный оператор * где?

Судя по двум примерам программ, ООП вы совершенно не понимаете. В ООП в первую очередь необходимо понимать идеологию, а техника программирования — дело наживное.

Односимвольные имена переменных плюс отсутствие комментариев — жуткая смесь :\

Кстати, еще один ляп:

char a[40];

вместит всего 39 цифр. Вы не учли концевой '\0', хотя далее в программе считаете, что он обязательно присутствует.

А почему бы не использовать gmp?

Ivan, потому что в задании написано: написать класс для перемножения 40-значных чисел.

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.

Ответить

Вы можете использовать разметку markdown для оформления комментариев и постов. Используйте функцию предпросмотра для проверки корректности разметки.

Пожалуйста, оформляйте исходный код в соответствии с правилами разметки. Для того, чтобы вставить код в комментарий, скопируйте его в текстовое поле ниже, после чего выделите то, что скопировали и нажмите кнопку «код» в панели инструментов. Иначе ваш код может принять нечитаемый вид.

Либо производите оформление кода вручную, следующим образом:

``` #include <iostream> using namespace std; int main() { // ... } ```

Предпросмотр сообщения

Ваше сообщение пусто.