题目链接
https://vjudge.net/contest/394826#problem/F
题目大意
求与7无关数的平方和。
与7无关:不能被7整除,十进制各个位不含7。
解题思路
前缀和,太简单了。这不是我想讲的。
WA代码
#include<bits/stdc++.h> #define ll long long using namespace std; const int N=1e6+10; ll n,t; ll ans[N]; bool is_7(int x){ if(x%7==0) return 1; while(x){ if(x%10==7) return 1; x/=10; } return 0; } int main(){ cin>>t; for(int i=1;i<=1e6;i++){//唯一区别 ans[i]=ans[i-1]; if(!is_7(i)) ans[i]+=i*i; } while(t--){ cin>>n; cout<<ans[n]<<endl; } }
AC代码
#include<bits/stdc++.h> #define ll long long using namespace std; const int N=1e6+10; ll n,t; ll ans[N]; bool is_7(int x){ if(x%7==0) return 1; while(x){ if(x%10==7) return 1; x/=10; } return 0; } int main(){ cin>>t; for(ll i=1;i<=1e6;i++){//唯一区别 ans[i]=ans[i-1]; if(!is_7(i)) ans[i]+=i*i; } while(t--){ cin>>n; cout<<ans[n]<<endl; } }
总结
我想表达啥?要用longlong不能用int表示i,尽管i最大为1e6,但是ans要加的是ii,假如i=1e6,那么ii=1e12,超出int范围,发生溢出,底层数据被截断,导致结果出错!
我真的是忽略了这点,直到对比了好几遍代码,才发现了错因,引以为戒!