Top.Mail.Ru
Ответы
Аватар пользователя
Аватар пользователя
Аватар пользователя
Аватар пользователя
Программирование
+4

Действительные числа,с++, без ООП

Друзья, помогите пожалуйста не понимаю в чем проблема.
Не проходит только 2 теста
#include "iostream"

using namespace std;

int main() {
double x,y,z;
cin>>x>>y>>z;
int n;
cin>>n;
double s,v,m;
double a,b,c,q;
int u=0;
double r,t,l;
int h=0,j=0;
for(int i=0;i<n;++i) {
cin>>a>>b>>c>>q;
s=a*q;
r+=s;
v=b*q;
t+=v;
m=c*q;
l+=m;
}
if (r>=x) j=1;
if (t>=y) h=1;
if (l>=z) u=1;
if(j==1&&h==1&&u==1) cout<<"YES"; else cout<<"NO";

return 0;
}
В некоторой сверхсекретной лаборатории изучаются физические возможности животных. Любой живой организм нуждается в трех компонентах пищи – белках, жирах и углеводах. Известен набор продуктов, имеющийся в распоряжении лаборатории, и меню животных – сколько единиц каждого продукта они получают. Известно также, сколько белков, жиров и углеводов необходимо для нормальной жизнедеятельности животного. Необходимо определить, получает ли животное достаточное количество питательных веществ. Известно, что животному требуется в сутки X белков, Y жиров и Z углеводов.

Известно также, что всего животное получает в сутки N продуктов питания, и для каждого из них известны Ai, Bi, Ci и Qi – соответственно, энергетическая ценность единицы продукта в белках, жирах и углеводах и количество единиц этого продукта. Все числа – действительные, заданные с точностью до 5 знаков после запятой.

Входные данные
На первой строке входных данных записаны числа X , Y и Z . На второй строке записано число N. Далее на N строках записаны, соответственно, Ai, Bi, Ci и Qi.

Выходные данные
Выведите YES , если данный пищевой рацион является достаточным по всем параметрам, и NO в противном случае.

По дате
По рейтингу
Аватар пользователя
Новичок
1234567891011121314151617181920212223242526272829
 #include <math.h>
#include <iostream>

using namespace std;

long long unsigned input() {
  long double t;
  cin >> t;
  return (long long unsigned)roundl(t * 100000.0);
}

int main() {
  long long unsigned 
    x = input() * 100000llu,
    y = input() * 100000llu,
    z = input() * 100000llu;
  long long unsigned sa = 0llu, sb = 0llu, sc = 0llu;

  unsigned n;
  cin >> n;
  for (unsigned i = 0; i < n; ++i) {
    long long unsigned a = input(), b = input(), c = input(), q = input();
    sa += a * q; 
    sb += b * q; 
    sc += c * q; 
  }

  cout << (sa >= x && sb >= y && sc >= z ? "YES" : "NO");
} 

Это только концепт. Проблема, скорее всего, из-за того, что вычисления с плавающей запятой всегда производятся с погрешностью. И тут три варианта - либо учитывать эту погрешность (ВУЗовский учебник вычислительной математики в помощь), либо использовать какую-то библиотеку чисел с фиксированной запятой (этот вариант нельзя назвать "без ООП"), либо переводить всё в целочисленную арифметику. Представленное - третий вариант. Но код не проверялся.