Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.10.2012, 19:46   #1
Quzya2
Пользователь
 
Регистрация: 24.03.2011
Сообщений: 18
По умолчанию Производение чисел заданых с строках

задание:
Найти произведение двух n-разрядних десятичных чисел (1<=n<=100), которые заданы в виде символьных строчек
Не использовать библиотек stdlib.h, string.h

Как алгоритм сделат ьпонимаю, а код чето напсиать не могу. Писал один код, но там для ращрядности больше 10 цифр дает кривой ризал: дабл округляет, а инт переполнен. Вообщем такой алгоритм:
есть у тебя 2 числа в 2х массивах - 123, 456. т.е. массивы по 3 элемента. тогда результирующий массив должен быть размером 5(6).
ты перемножаешь все разряды первого числа с нулевым разрядом второго числа. заносишь их поэлементно в результирующий. т.е. умножил нулевой разряд первого на нулевой второго, занес в нулевой тертьего, первый на нулевой - в первый третьего и т.п.
если все числа в третьем массиве меньше 10, переходишь к перемножению первого числа с первым разрядом второго. если нет, идешь с нулевого элемента третьего массива и сравниваешь числа с 10. если больше - то -10 к текущему значению ячейки, + 1 к значению следующей ячейки



Ну если комуто надо, то старая прога, но походу она не нужна.
Код:
#include "stdafx.h"
#include <conio.h>
#include <stdio.h>




int main(void){
//system("cls");
int t,i;
__int64 k,k1=0,k2=0;
char s1[100],s2[100];
printf("input number:");
scanf("%s",s1);
printf("input number:");
scanf("%s",s2);
for(int i=0;s1[i]!='\0';i++)
{
t=s1[i];
k1*=10;
k1+=t-48;
}
for(int i=0;s2[i]!='\0';i++)
{
t=s2[i];
k2*=10;
k2+=t-48;
}
k=k1*k2;
printf("Dobutok:%d",k);
getch();


return 0;
}
язык - с.
Quzya2 вне форума Ответить с цитированием
Старый 28.10.2012, 22:00   #2
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

__int64 - не нужен априори. 100-значные числа не влезут.

Смысл в том, чтобы выполнить умножение "в столбик" (есть способы чуть быстрее, но не думаю, что они сейчас для Вас актуальны):
Код:
1. Прочитать числа (длины <=100).
2. Взять массив под ответ достаточной длины. Заполнить '0'.
3. Для каждой цифры первого множителя, начиная с младшего разряда,
    4. В переменную "перенос" записать 0.
    5. Для каждой цифры второго множителя, начиная с младшего разряда,
        6. Найти произведение цифр (это целое число от 0 до 81),
        7. Взять цифру соответствующего разряда в массиве ответа, прибавить к произведению.
        8. Прибавить "перенос" к произведению.
        9. Записать символ, соответствующий разряду единиц произведения, в массив ответа.
        10. Записать число, соответствующее разряду десятков произведения, в "перенос".
11. Вывести ответ, возможно, опустив ведущие нули.
Попробуйте сначала для нескольких пар чисел выполнить алгоритм выше руками на бумаге - это поможет при написании кода. В конце концов, почти невозможно заставить компьютер сделать то, чего не понимает сам программист.
Abstraction вне форума Ответить с цитированием
Старый 28.10.2012, 22:18   #3
Quzya2
Пользователь
 
Регистрация: 24.03.2011
Сообщений: 18
По умолчанию

Цитата:
Сообщение от Abstraction Посмотреть сообщение
__int64 - не нужен априори. 100-значные числа не влезут.

Смысл в том, чтобы выполнить умножение "в столбик" (есть способы чуть быстрее, но не думаю, что они сейчас для Вас актуальны):
Код:
1. Прочитать числа (длины <=100).
2. Взять массив под ответ достаточной длины. Заполнить '0'.
3. Для каждой цифры первого множителя, начиная с младшего разряда,
    4. В переменную "перенос" записать 0.
    5. Для каждой цифры второго множителя, начиная с младшего разряда,
        6. Найти произведение цифр (это целое число от 0 до 81),
        7. Взять цифру соответствующего разряда в массиве ответа, прибавить к произведению.
        8. Прибавить "перенос" к произведению.
        9. Записать символ, соответствующий разряду единиц произведения, в массив ответа.
        10. Записать число, соответствующее разряду десятков произведения, в "перенос".
11. Вывести ответ, возможно, опустив ведущие нули.
Попробуйте сначала для нескольких пар чисел выполнить алгоритм выше руками на бумаге - это поможет при написании кода. В конце концов, почти невозможно заставить компьютер сделать то, чего не понимает сам программист.
мне кажется, что мой алгоритм проще. инт 64 не нужен,я знаю. просто последнее что пробывал.
мне бы код, а то уже полтоыр неелди парюсь, не могу сам никак.
Quzya2 вне форума Ответить с цитированием
Старый 29.10.2012, 01:12   #4
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
Сообщение от Quzya2 Посмотреть сообщение
мне кажется, что мой алгоритм проще. инт 64 не нужен,я знаю. просто последнее что пробывал.
мне бы код, а то уже полтоыр неелди парюсь, не могу сам никак.
Ваш алгоритм неправилен. "Проще" при этом, как догадываетесь, иррелевантно.
Код:
//1. Прочитать числа (длины <=100).
ReadLongNumber(s1, 100);
ReadLongNumber(s2, 100);
//2. Взять массив под ответ достаточной длины. Заполнить '0'.
char result[201];
InitWithZeroes(result, 200);
//3. Для каждой цифры первого множителя, начиная с младшего разряда,
for(int i=strlen(s1)-1; i>=0; --i){
    //4. В переменную "перенос" записать 0.
    int carry = 0;
    //5. Для каждой цифры второго множителя, начиная с младшего разряда,
    for(int j=strlen(s2)-1; j>=0; --j){
        //6. Найти произведение цифр (это целое число от 0 до 81),
        int product = CharToNum(s1[i])*CharToNum(s2[j]);
        //7. Взять цифру соответствующего разряда в массиве ответа, прибавить к произведению.
        int answerPosition = 201 - strlen(s1) - strlen(s2) + i + j;
        product += CharToNum(result[answerPosition]);
        //8. Прибавить "перенос" к произведению.
        product += carry;
        //9. Записать символ, соответствующий разряду единиц произведения, в массив ответа.
        result[answerPosition] = NumToChar(product%10);
        //10. Записать число, соответствующее разряду десятков произведения, в "перенос".
        carry = product/10;
    }
}
//11. Вывести ответ, возможно, опустив ведущие нули.
OutputLongNumber(result, 200);
Abstraction вне форума Ответить с цитированием
Старый 29.10.2012, 01:23   #5
Quzya2
Пользователь
 
Регистрация: 24.03.2011
Сообщений: 18
По умолчанию

Цитата:
Сообщение от Abstraction Посмотреть сообщение
Ваш алгоритм неправилен. "Проще" при этом, как догадываетесь, иррелевантно.
Код:
//1. Прочитать числа (длины <=100).
ReadLongNumber(s1, 100);
ReadLongNumber(s2, 100);
//2. Взять массив под ответ достаточной длины. Заполнить '0'.
char result[201];
InitWithZeroes(result, 200);
//3. Для каждой цифры первого множителя, начиная с младшего разряда,
for(int i=strlen(s1)-1; i>=0; --i){
    //4. В переменную "перенос" записать 0.
    int carry = 0;
    //5. Для каждой цифры второго множителя, начиная с младшего разряда,
    for(int j=strlen(s2)-1; j>=0; --j){
        //6. Найти произведение цифр (это целое число от 0 до 81),
        int product = CharToNum(s1[i])*CharToNum(s2[j]);
        //7. Взять цифру соответствующего разряда в массиве ответа, прибавить к произведению.
        int answerPosition = 201 - strlen(s1) - strlen(s2) + i + j;
        product += CharToNum(result[answerPosition]);
        //8. Прибавить "перенос" к произведению.
        product += carry;
        //9. Записать символ, соответствующий разряду единиц произведения, в массив ответа.
        result[answerPosition] = NumToChar(product%10);
        //10. Записать число, соответствующее разряду десятков произведения, в "перенос".
        carry = product/10;
    }
}
//11. Вывести ответ, возможно, опустив ведущие нули.
OutputLongNumber(result, 200);
спс. парвда мы не все эт ифункции учили. хз подойдет ли)

можна как то 6,7 ,9 и 11 пункт пояснить?

___________
будьте осторожны, Оверквотинг (overquoting) (избыточное цитирование) на форуме запрещено!
цитируйте только то, что Вам необходимо при ответе, не надо цитировать полностью ответ.

Модератор.

Последний раз редактировалось Serge_Bliznykov; 29.10.2012 в 08:55.
Quzya2 вне форума Ответить с цитированием
Старый 29.10.2012, 08:53   #6
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Функции ReadLongNumber, OutputLongNumber, InitWithZeroes, CharToNum и NumToChar Вам придётся написать самостоятельно. Должны делать ровно то, что написано (NumToChar и CharToNum преобразуют значение цифры в соответствующий ей символ и обратно).

Код:
201 - strlen(s1) - strlen(s2) + i + j
Это вычисление разряда, в который попадает младшая часть произведения соответствующих разрядов. Ещё раз повторюсь - советую вначале пройти по алгоритму руками на бумаге, это поможет его понять; также, в алгоритме пропущен один (важный) пункт - если попробовать выполнить его для конкретных чисел, проблема станет очевидной.
Abstraction вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вычисление максимального из заданых чисел jaros21 Помощь студентам 2 24.03.2011 00:53
Вычеслить произведение элементов с парными индексами заданых массивов D(18),E(14),G(15),и вывести их отде AndrewPl Помощь студентам 9 14.05.2010 09:50
Поиск одинаковых значений в стобце, возврат суммы чисел из другого столбца в найденных строках! Kup Microsoft Office Excel 2 25.03.2010 10:15
Найти найменший прямоугольник,который описывает два заданых отрезка мукуль Помощь студентам 2 21.02.2009 17:43
поиск и замена файлов в заданых каталогах adramelech Общие вопросы Delphi 1 12.09.2007 16:29