Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 23, средняя оценка - 4.83
rovel
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 25
#1

Нахождение остатка от деления любых дробных чисел - C++

16.03.2012, 00:27. Просмотров 2957. Ответов 5
Метки нет (Все метки)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
// Ostatok.cpp : Defines the entry point for the console application.
//
 
#include "stdafx.h"
#include "string.h"
#include "stdio.h"
#include <iostream.h>
 
int CharToInt(char s)//перевод в целые числа
{
    int k;
    switch (s)
    {
        case '0': k=0; break;
        case '1': k=1; break;
        case '2': k=2; break;
        case '3': k=3; break;
        case '4': k=4; break;
        case '5': k=5; break;
        case '6': k=6; break;
        case '7': k=7; break;
        case '8': k=8; break;
        case '9': k=9; break;
    }
    return k;
 
}
 
int main(int argc, char* argv[])
{
int i, j, lendel1, lendel2, l, znac,s1d,s2d,raznd,s1ch,s2ch,k,r,k1,j1,ss1[50],ss2[50],t;
char s1[51], s2[51], res[51], s1cop[51];
printf("Vvedite chisla \n");
s1d=0;
s2d=0;
gets(s1); //вводим переменные
gets(s2);
for(i=0;i<50;i++)//обнуляем массивы чисел
{
    ss1[i]=0;
    ss2[i]=0;
}
for (i=0; i<strlen(s1); i++)
{
if ((s1[i]=='.') | (s1[i]==',')) 
{
    s1d=strlen(s1)-i-1;//количество знаков после запятой в числителе
    s1ch=i;//количество до запятой знаков в числителе
}
}
for (i=0; i<strlen(s2); i++)
{
if ((s2[i]=='.') | (s2[i]==',')) 
{
    s2d=strlen(s2)-i-1;//количество знаков после запятой в знаменателе
    s2ch=i;//количество до запятой знаков в заменателе
}
}
j=0;
j1=0;
for (i=0; i<strlen(s1); i++)//цикл заполнения массива чисел числителя
if ((s1[i]!='.') & (s1[i]!=',')) //исключаем запятую и точку
{
    ss1[j1]=CharToInt(s1[i]);//заполнение элемента
    j1++;
}
for (i=0; i<strlen(s2); i++)//цикл заполнения массива чисел знаменателя
if ((s2[i]!='.') & (s2[i]!=',')) //исключаем запятую и точку
{
    ss2[j]=CharToInt(s2[i]);//заполнение элемента
    j++;
}
if (s1d>s2d) { raznd=s1d-s2d; j=j+raznd;}//считаем порядки чисел
else {raznd=s2d-s1d; j1=j1+raznd;}
if (s1ch<s2ch) cout<<s1;//если числитель меньше, то выводим его как остаток
else 
{
    do
    {
        l=0;
        t=j1-j;
        while (t!=1)// при вычитании проверяем не равны ли 0 числа массива, порядок которых больше знаменателя
        {
            t--;
            if ((ss1[t]<=0) & (ss1[t-1]>0)) { ss1[t-1]--; ss1[t]=ss1[t]+10;}
        }
        for (i=j1;i>j1-j;i--)//цикл вычитания
        {
            if (ss1[i]<ss2[i-j1+j]) {ss1[i-1]--; ss1[i]=ss1[i]+10;}
            ss1[i]-=ss2[i-j1+j];
        }
        for (i=0;i<j1-j;i++)//проверяем бльше ли 0 числа  порядок которых больше знаменателя
            if (ss1[i]>0) l++;
        if (ss1[j1-j+1]>ss2[0]) l++;//проверяем меньше ли первая цифра знаменателя чем цифра того же порядка числителя
    } while (l!=0);//проверяем условие для завершения цикла
    for (r=j;r<j1;r++)//выводим число.
        cout<<ss1[r];
    
}
return 0;
}
Эта прога должна находить остаток от деления любых дробных чисел. В качестве входных данных числа с 50 цифрами. Операция : остаток от деления. Операнды: дробные числа без знака с фиксированной запятой. Вот написал код один человек, но он реализовал так - вместо того , чтобы делить в столбик, решил вычитать, пока уменьшаемое не будет меньше вычитаемого, и в итоге получится остаток. Но программа не работает, где-то ошибка?

 Комментарий модератора 
rovel, Правила
3.3. Запрещено создавать темы с бессмысленными названиями вроде "Помогите!", "Вопрос" и т.п.
Изначальное название темы: "помогите разобраться с кодом!".
п.2.7. Избегайте грамматических ошибок при написании сообщений - уважайте себя и других участников форума.
С вашей стороны это даже не грамматические ошибки, а злостное неуважение людей, от которых вы ждете помощи.

Устное предупреждение.
оригинал
эта прога должна находить остаток от деления любых дробных чисел...в качестве входных данных числа с 50 цифрами...операция :остаток от деления...операнды:дробные числа без знака с фиксированной запятой...вот написал код один человек...но он реализовал так...он вместо того , чтобы делить в столбик ...решил вычитать, пока уменьшаемое не будет меньше вычитаемого...и в итоге получится остаток...но программа не работает, где-то ошибка...
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.03.2012, 00:27     Нахождение остатка от деления любых дробных чисел
Посмотрите здесь:

C++ Дано целое число N(>0).используя операции деления нацело и взятия остатка от деления, найти количество и сумму его цифр
Рекурсия: сложение, вычитание, деление и вычисление остатка от деления двух целых чисел C++
Определить результат целочисленного деления a на b, не используя стандартные операции вычисления остатка C++
C++ C++ функция деления нацело без остатка
Битовые операции. Сдвиг вправо и взятие остатка от деления C++
Используя одну операцию деления нацело и одну операция взятия остатка от деления найти цифру. соответствующую разряду ты C++
C++ Rand(), приоритет умножения и остатка от деления
C++ Помогите найти ошибку в программе нахождения остатка от деления на 12
C++ Определение остатка от деления с помощью побитовых операций
C++ Написать программу вычисления частного и остатка от деления двух целых чисел
C++ Вернуть число из остатка от деления
Используя операции деления нацело и взятия остатка от деления, определить, имеется ли в записи числа цифра k C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ValeryS
Модератор
6514 / 4980 / 460
Регистрация: 14.02.2011
Сообщений: 16,497
16.03.2012, 01:37     Нахождение остатка от деления любых дробных чисел #2
не поверишь вот это
Цитата Сообщение от rovel Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int CharToInt(char s)//перевод в целые числа
{
 int k;
 switch (s)
 {
 case '0': k=0; break;
 case '1': k=1; break;
 case '2': k=2; break;
 case '3': k=3; break;
 case '4': k=4; break;
 case '5': k=5; break;
 case '6': k=6; break;
 case '7': k=7; break;
 case '8': k=8; break;
 case '9': k=9; break;
 }
 return k;
}
можно сделать вот так
C++
1
2
3
4
5
6
int CharToInt(char s)//перевод в целые числа
{
  if (s<'0' || s>'9')
      return -1 // ошибка можешь вернуть 0
 return (int) (s-'0');
}
или так но будет дольше(деление дольше выполняется чем вычитание)
C++
1
2
3
4
5
6
int CharToInt(char s)//перевод в целые числа
{
  if (s<'0' || s>'9')
      return -1 // ошибка можешь вернуть 0
 return (int) (s%10);
}
у тебя в функции не проверяется s
если s не цифра то вернется мусор
Russian_Dragon
10 / 11 / 0
Регистрация: 18.02.2012
Сообщений: 140
16.03.2012, 01:41     Нахождение остатка от деления любых дробных чисел #3
Цитата Сообщение от rovel Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int CharToInt(char s)//перевод в целые числа
{
    int k;
    switch (s)
    {
        case '0': k=0; break;
        case '1': k=1; break;
        case '2': k=2; break;
        case '3': k=3; break;
        case '4': k=4; break;
        case '5': k=5; break;
        case '6': k=6; break;
        case '7': k=7; break;
        case '8': k=8; break;
        case '9': k=9; break;
    }
    return k;
}
Можно гораздо проще
C++
1
int CharToInt(char s){ return s - char('0');}
Зачем первые четыре цикла - не понятно, всё в двух можно сделать легко. А вообще, по хорошему, нужна функция.
Ну, а дальше ошибка на ошибке. В общем ошибка одна в ДНК, ну или слишком начинающий программист взялся за весьма не простую задачу.
ValeryS
Модератор
6514 / 4980 / 460
Регистрация: 14.02.2011
Сообщений: 16,497
16.03.2012, 01:47     Нахождение остатка от деления любых дробных чисел #4
Цитата Сообщение от rovel Посмотреть сообщение
качестве входных данных числа с 50 цифрами
Цитата Сообщение от rovel Посмотреть сообщение
int...,s1d,s2d,
ты уверен что 50 значное число влезет в int????
работай с дублей( double)
и соответственно пересмотри весь перевод

Добавлено через 1 минуту
Цитата Сообщение от Russian_Dragon Посмотреть сообщение
Можно гораздо проще
C++
1
 int CharToInt(char s){ return s - char('0');}
нельзя
если s не цифра что вернется???
Russian_Dragon
10 / 11 / 0
Регистрация: 18.02.2012
Сообщений: 140
16.03.2012, 02:35     Нахождение остатка от деления любых дробных чисел #5
Цитата Сообщение от ValeryS Посмотреть сообщение
нельзя
если s не цифра что вернется???
число)) Но за пределами диапазона 0..9, что терпимо. Но соглашусь, что возвращать -1 вполне логично и правильно.

Добавлено через 37 минут
Цитата Сообщение от ValeryS Посмотреть сообщение
ты уверен что 50 значное число влезет в int????
работай с дублей( double)
и соответственно пересмотри весь перевод
Ну, как бы, в double 50 значное тоже не влезет.
ValeryS
Модератор
6514 / 4980 / 460
Регистрация: 14.02.2011
Сообщений: 16,497
16.03.2012, 04:55     Нахождение остатка от деления любых дробных чисел #6
Цитата Сообщение от Russian_Dragon Посмотреть сообщение
Ну, как бы, в double 50 значное тоже не влезет.
вообще то там до 10 в 308(по моему) но мантисса то точно не влезет
если все разряды важны то
2 в 10 примерно равна 10 в 3
тогда 50/3 =17
17*10 =170 бит для хранения 50 значных беззнаковых чисел
только свой тип
Yandex
Объявления
16.03.2012, 04:55     Нахождение остатка от деления любых дробных чисел
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru