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],他有多少次可能成功分享巧克力,这样巧克力就不会超过他的库存。必须满足的条件是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,你也会增
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;
}