С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
5 / 5 / 1
Регистрация: 06.10.2020
Сообщений: 176
1

Ошибка компиляции или сравнение вещественных чисел

30.11.2020, 01:43. Показов 1277. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Решение задачи проходит 91 тест из 100, на оставшихся 9 ошибка компиляции. Думаю, что это из-за сравнения вещественных чисел в 44-45 строках. Пробовал изворачиваться фабсами, но нужно проверить условие, больше ли одно число другого. Решил домножить на 10000000, тоже не помогло.

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
#include <iostream>
#include <fstream>
#include <tuple>
#include <vector>
#include <set>
 
#define int long long
using namespace std;
 
int32_t main() {
    
    vector<tuple<string, int, double>> arr;
    set<int> set1;
    ofstream fout("output.txt");
    ifstream fin("input.txt");
    string name, surname; 
    int a;
    double sum = 0;
    
    while (fin >> name >> surname >> a) {
        arr.emplace_back(tuple<string, int, double>(name + " " + surname, a, 0));
        sum += a;
    }
    
    sum/=450;
    
    int sum2 = 0;
    for (size_t i = 0; i < arr.size(); ++i) {
        get<2>(arr[i]) = get<1>(arr[i])/sum;
        get<1>(arr[i]) /= sum;
        get<2>(arr[i])-=get<1>(arr[i]);
get<2>(arr[i])*=10000000; // попытка домножить
        sum2+=get<1>(arr[i]);
        //fout << get<1>(arr[i]) << " " << get<2>(arr[i]) << endl;
    }
    
    int ost = 450 - sum2;
     
    while (ost > 0) {
        double max = 0;
        int maxx = 0;
        for (size_t i = 0; i < arr.size(); ++i) {
            const bool is_in1 = set1.find(i) != set1.end();
            if (not(is_in1) && get<2>(arr[i]) == max && get<1>(arr[i]) > get<1>(arr[maxx])) max = get<2>(arr[i]), maxx = i;
            if (not(is_in1) && get<2>(arr[i]) > max) max = get<2>(arr[i]), maxx = i; //сравнение вещественных
        }
        get<1>(arr[maxx]) += 1;
        set1.insert(maxx);
        ost--;
    }
    
    for (size_t i = 0; i < arr.size(); ++i) {
        fout << get<0>(arr[i]) << " " << get<1>(arr[i]) << endl;
    }
    
    return 0;
}
Условие самой задачи:
Необходимо распределить 450 мест между партиями, участвовавших в выборах. Сначала подсчитывается сумма голосов избирателей, поданных за каждую партию и подсчитывается сумма голосов, поданных за все партии. Эта сумма делится на 450, получается величина, называемая “первое избирательное частное” (смысл первого избирательного частного - это количество голосов избирателей, которое необходимо набрать для получения одного места в парламенте).

Далее каждая партия получает столько мест в парламенте, чему равна целая часть от деления числа голосов за данную партию на первое избирательное частное.

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

Входные данные
На вход программе подается список партий, участвовавших в выборах. Каждая строка входного файла содержит название партии (строка, возможно, содержащая пробелы), затем, через пробел, количество голосов, полученных данной партией – число, не превосходящее 108.

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

Примеры

входные данные
Party One 100000
Party Two 200000
Party Three 400000

выходные данные
Party One 64
Party Two 129
Party Three 257
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.11.2020, 01:43
Ответы с готовыми решениями:

Сравнение вещественных чисел
Привет, ребят! Нужна ваша мудрость. На днях думал о реализации класса complex&lt;class scalar&gt; из...

Сравнение вещественных чисел
Будто бы простая задача: сравнить два действительных числа в стеке, то, которое является меньшим -...

Сравнение вещественных чисел
А как правильно сравнивать (&lt;&gt;, =) вещественные числа?

Сравнение вещественных чисел
Почему нельзя сравнивать вещественные числа 2.72&lt;3.14? Как это делать правильно?

3
319 / 216 / 114
Регистрация: 14.05.2020
Сообщений: 890
30.11.2020, 02:21 2
Del
0
5 / 5 / 1
Регистрация: 06.10.2020
Сообщений: 176
30.11.2020, 12:17  [ТС] 3
Цитата Сообщение от VLaDoS_2001a Посмотреть сообщение
Del
Ничего не понял...
0
863 / 513 / 215
Регистрация: 19.01.2019
Сообщений: 1,216
30.11.2020, 20:37 4
Лучший ответ Сообщение было отмечено mangomang как решение

Решение

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
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
#include <string>
#include <math.h>
 
 
struct S { std::string s; int n, v; double ci, cf; };
 
bool cmp1(S& lhs, S& rhs) { return lhs.cf == rhs.cf ? lhs.v > rhs.v : lhs.cf > rhs.cf; }
bool cmp2(S& lhs, S& rhs) { return lhs.n < rhs.n; }
 
 
int main()
{
    std::ifstream is("input.txt");
    std::ofstream os("output.txt");
 
    std::vector<S> v;
    std::string str;
 
    for (int i{}; std::getline(is, str); ++i) {
        size_t off = str.find_last_of(" ") + 1;
        v.push_back({ str.substr(0, off), i, std::stoi(str.substr(off, str.size() - off)), 0., 0. });
    }
 
    double d{};
    for (auto& it : v) d += it.v;
    d /= 450.;
 
    int t{};
    for (auto& it : v) {
        it.cf = std::modf(double(it.v) / d, &it.ci);
        t += it.ci;
    }
 
    std::sort(v.begin(), v.end(), cmp1);
    for (int i{}; i < 450 - t; ++i) ++v[i % v.size()].ci;
    std::sort(v.begin(), v.end(), cmp2);
 
    for (auto& it : v) os << it.s << int(it.ci) << '\n';
 
    return 0;
}
1
30.11.2020, 20:37
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.11.2020, 20:37
Помогаю со студенческими работами здесь

Сравнение вещественных чисел
USES CRT; begin clrscr; if 0.3*3&lt;&gt;0.9 then writeln (0.3*3,'&lt;&gt;',0.9); readln; end. ...

Сравнение вещественных чисел
И так, всем понятно (надеюсь) что код ниже выведет false. Как сравнить эти два числа, используя...

Сравнение вещественных чисел
Помоготе пожалуйста с задачкой. Нужно сравнить 2 вещественных числа и записать в переменную как...

Сравнение двух вещественных чисел
Почему не работает сравнение при числах: 2.85730505 2.85729861 bool isEqual( float x, float y...

Сравнение вещественных чисел double
#include &lt;iostream&gt; #include &lt;cmath&gt; using namespace std; double heron(double, double, double);...

Квадрат, сравнение вещественных чисел.
Помогите, не могу врубиться в задание (перевожу с Латышского дословно) поэтому может получиться...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru