C++ 发现不等式为真的次数的问题

C++ 发现不等式为真的次数的问题,c++,C++,我有一道数学题。该程序由5个输入变量p、q、r、L、r和1个输出组成 问题:一个人有N个巧克力。他希望与3人分享。第一个人会得到N/p巧克力,如果分数是5.00,他会给这个人5,但是如果分数是5.01左右,你必须把/p降到一个更高的数字。他把L/q巧克力给第二个人,把L/r巧克力给第三个人。如果数字N从[L,R]变为[N],他有多少次可能成功分享巧克力,这样巧克力就不会超过他的库存。必须满足的条件是 ceilL/p+ceilL/q+ceilL/r在我看来,你应该使用这样一个事实:增加L,你也会增

我有一道数学题。该程序由5个输入变量p、q、r、L、r和1个输出组成

问题:一个人有N个巧克力。他希望与3人分享。第一个人会得到N/p巧克力,如果分数是5.00,他会给这个人5,但是如果分数是5.01左右,你必须把/p降到一个更高的数字。他把L/q巧克力给第二个人,把L/r巧克力给第三个人。如果数字N从[L,R]变为[N],他有多少次可能成功分享巧克力,这样巧克力就不会超过他的库存。必须满足的条件是


ceilL/p+ceilL/q+ceilL/r在我看来,你应该使用这样一个事实:增加L,你也会增加L/p、L/q和L/r的剩余部分

所以我想你只能计算三个除法,避免循环中的除法

我是说。。。而不是

for (; L<=R; L++) {

    if(( ceil((long double)L/p)+ ceil((long double)L/q ) + ceil((long double)L/r) ) <= L) {
        i++;
    }
}
您可以编写警告:只使用2、3、7、9、14测试代码

auto dp = std::lldiv(L, p);
auto dq = std::lldiv(L, q);
auto dr = std::lldiv(L, r);

auto rp = dp.rem;
auto rq = dq.rem;
auto rr = dr.rem;

auto sum =   dp.quot + (rp ? 1ll : 0ll)
           + dq.quot + (rq ? 1ll : 0ll)
           + dr.quot + (rr ? 1ll : 0ll);

while ( L <= R )
 {
   if ( sum <= L++ )
      ++i ;

   if ( 1ll == ++rp )
      ++sum;
   else if ( p == rp )
      rp = 0ll;

   if ( 1ll == ++rq )
      ++sum;
   else if ( q == rq )
      rq = 0ll;

   if ( 1ll == ++rr )
      ++sum;
   else if ( r == rr )
      rr = 0ll;
 }
也许,你可以简化一下if-else-if部分


离题:我对所有变量都使用了long-long:p、q、r、L、r和I。

请发布调试会话的结果。哪一行或哪一句话导致了问题?实际的变量值是什么?期望值是什么?在while循环中,R在哪里更改其值?int j=Y/X存在截断和符号问题。无符号long-long可能比int大很多,不适合。此外,Y/X是一个无符号结果,但您将其放入一个有符号变量中。有符号变量的范围可能小于无符号变量。L在哪里声明?它的初始值是多少?它会改变它的价值吗?p、q和r在哪里?投票关闭,由于缺少变量而无法编译。我不确定我是否理解如何正确使用此代码。我用你告诉我的零件替换了它,但上面写着“dp不命名类型”etc@snickex-嗯。。。很抱歉你在用C++98吗?
auto dp = std::lldiv(L, p);
auto dq = std::lldiv(L, q);
auto dr = std::lldiv(L, r);

auto rp = dp.rem;
auto rq = dq.rem;
auto rr = dr.rem;

auto sum =   dp.quot + (rp ? 1ll : 0ll)
           + dq.quot + (rq ? 1ll : 0ll)
           + dr.quot + (rr ? 1ll : 0ll);

while ( L <= R )
 {
   if ( sum <= L++ )
      ++i ;

   if ( 1ll == ++rp )
      ++sum;
   else if ( p == rp )
      rp = 0ll;

   if ( 1ll == ++rq )
      ++sum;
   else if ( q == rq )
      rq = 0ll;

   if ( 1ll == ++rr )
      ++sum;
   else if ( r == rr )
      rr = 0ll;
 }