【问题标题】:Issues with modulo operator in c++ [closed]C ++中模运算符的问题[关闭]
【发布时间】:2020-05-26 14:33:23
【问题描述】:

所以我正在解决一个 codeforces 问题并发现了这个......

#include <iostream>

int main()
{
    long long var = 1e17;
    long long mod = 998244353;
    std::cout << var % mod;
}

输出是:

470904831

这实际上不是正确的答案。正确答案是:

470904832

实际上,在问题中,它是使用乘法和加法的模运算符原理的循环,但这是失败的示例之一。

如果有人能告诉我发生了什么,那将有很大帮助。

编辑:我可能有一些误解,我将结果与在线模计算器进行了比较,结果与代码不一致......所以,看看我的代码与问题本身。

问题链接:here

我在下面的代码中做的事情如下,

我们注意到f(ai,aj)=k可以写成如下,

假设 ai=12 和 aj=34,k=1020 + 304=1324。

我将 1020 称为“左移”,因为从右附加零并且数字左移。

类似的304被称为“右移”,每个数字都被添加到两种形式的最终结果中,并且两种形式都出现了“n”次。

最后,我们只需将它们相加并返回它们的模数。

到此为止,如果我的工作有任何错误,请告诉。

以下是暗示,(请不要对我的做事方式苛刻,我正在学习,如果你可以少几行,请不要评判)

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    //--<for debugging>
    #define whatis(x) cout << #x << " is " << x<<" ";
    #define whatisl(x) cout << #x << " is " << x<<"\n";
    #define parr(array,end)for(ll loop=0;loop<end;loop++)cout<<array[loop]<<" ";cout<<"\n";
    #define lline cout<<"\n";
    #define errorl(args...) { string _s = #args; replace(_s.begin(), _s.end(), ',', ' '); stringstream _ss(_s); istream_iterator<string> _it(_ss); err(_it, args);cout<<"\n";}
    #define error(args...) { string _s = #args; replace(_s.begin(), _s.end(), ',', ' '); stringstream _ss(_s); istream_iterator<string> _it(_ss); err(_it, args);cout<<"___";}
        
    void err(istream_iterator<string> it) {}
    template<typename T, typename... Args>
    void err(istream_iterator<string> it, T a, Args... args) {
        cout << *it << " = " << a <<" , ";
        err(++it, args...);
    }
    //--</for debugging> 
    #define rep(i, begin, end) for (__typeof(end) i = (begin) - ((begin) > (end)); i != (end) - ((begin) > (end)); i += 1 - 2 * ((begin) > (end)))
    #define testcase ll tt; cin >> tt; while(tt--)
    #define boost ios_base::sync_with_stdio(false);cin.tie(NULL);
    #define pb push_back 
    #define vars ll h,i,j,k,d,l,p,q,r,x,y,a,b,c,v,var,n,m,z,s,ans,ind1,ind2,flag,limit1,limit2,limit3,mod;
    #define vll vector<ll>
    #define pll pair<ll,ll>
    #define sll set<ll>
    #define pint pair<int,int>
    const ll INF=1e9+7;
    const ll MOD=998244353;
    int main()
    {
        boost vars
        cin>>n;
        ll arr[n];
        for(i=0;i<n;i++)cin>>arr[i];
        ans=0;
        for(i=0;i<n;i++)
        {
            v=arr[i];
            s=0;
            p=10;
            //left shift
            while(v)
            {
                z=v%10;
                v/=10;
                s=(s+(p*z)%MOD)%MOD;
                p=(p*100)%MOD;
                //errorl(p);
            }
            error(s);
            a=(s*n)%MOD;s=0;v=arr[i];p=1;
            // right shift
            while(v)
            {
                z=v%10;
                v/=10;
                s=(s+(p*z)%MOD)%MOD;
                p=(p*100)%MOD;
            }
            b=(s*n)%MOD;
            ans+=(a+b)%MOD;
            errorl(s,a,b,ans);
        }
        cout<<ans;
    }

当 Input = 时代码给出了错误的答案

5

1000000000 1000000000 1000000000 1000000000 1000000000

正确答案是

265359409

我的代码给出了答案 =

2261848115

我非常感谢你诚实的努力,我没想到会有这么多人回复这个。

【问题讨论】:

  • 为什么要包含非标准的“bits/”标头?
  • 打印var的值。由于浮点数不准确,很可能它被关闭了:stackoverflow.com/questions/588004/…
  • 您是如何获得“正确”答案的?见here
  • var=1e17 是浮点到long long 的转换。
  • @RichardCritten 但这不是错误的原因

标签: c++ modulo


【解决方案1】:

您的程序产生了正确的结果。

取 1e17,即 100,000,000,000,000,000。 整数除以 998,244,353;商是:100,175,873。

您甚至不必继续计算 - 除数和商是奇数,因此它们的乘积是奇数,因此它们与偶数被除数的差也必须是奇数。因此,您的“正确答案”一定是错误的。

但要继续计算 - 将整数商乘以 998,244,353;你得到:99,999,999,529,095,169。

与 1e17 的差值确实是 470,904,831。

现在,正如@RichardCritten 所指出的,文字1e17 在C++ 中属于double 类型......所以也许一些浮点错误会以某种方式在您自己的计算中蔓延?

【讨论】:

  • 如果是这样的话,我很抱歉......但实际上在线模计算器给出了不同的答案,所以我将它与那个进行了比较......这是网站......goodcalculators.com/modulo-calculator
  • @martinrose:也许他们应该将该网站的名称更改为“好 +/- 1 计算器点 com”:-)
  • 你喜欢竞争编码吗?我更新了我的帖子,现在它有问题的代码,你能找到错误吗?
  • @martinrose:这是一个不同的问题。请不要在第一个问题的基础上再问第二个问题。
  • 是的...当我读到它时,这听起来很烦人...但是如果可以的话请找出错误...
【解决方案2】:

你错了。正确答案其实 470904831。

100'000'000'000'000'000 / 998'244'353 == 100'175'873 + 470'904'831/998'244'353

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多