记录一道我来来回回提交了十几次都没过的题QWQ;
一定不要用pow函数!!!QAQ
一定不要用pow函数!!!QAQ
一定不要用pow函数!!!QAQ
我知道在这里塞一堆一级标题很突兀,可是这点真的好重要,我来来回回十几次都是因为这个点错掉的QAQ
G. Disappearing Number
题目链接:https://codeforces.com/gym/105257/problem/G
思路+代码
正解
#include<bits/stdc++.h>
using namespace std;
#define int long long
int _xto10(int n,int x){
string s=to_string(n);
int len=s.size();
int nn=0;
for(int i=0;i<len;i++){
nn*=x;
nn+=(s[i]-'0');
}
return nn;
}
signed main()
{
int t;cin>>t;
while(t--){
int n,x;cin>>n>>x;
int ans;
if(x==9) ans=_xto10(n,9)+1;
else{
string s=to_string(n);
for(int i=0;i<s.size();i++){
if(s[i]-'0'>x){
s[i]=s[i]-1;
}
}
n=stoll(s);
ans=_xto10(n,9)+1;
}
cout<<ans<<"\n";
}
return 0;
}
非正解(vp的时候是这么想的QAQ)
举个例子说明思路:假设n=5421,x=3;
(思路有点类似小学奥数的纯找规律QAQ)
- 整体思路是用正常的序数-需要删去的数字的个数;
- 如例子,可以把5421需要删去的个数拆成1~5000内需要删去的个数,1~400内需要删去的个数,1~20内需要删去的个数和1~1内需要删去的个数之和;
- 拿计算1~5000内需要减去的个数为例:又可以拆到以每一千需要减去的个数为一个单位,一共需要减去几个单位;
- 所以我们可以专门造一个数组(我的代码里边用的a数组)来记录每一位的一个单位需要减去的个数(如5000是四位数,所以每一千需要减去的个数用a[4]来储存)
- 但这里有需要判断一下:比如0~5000中5>x(3),此时需要减去的个数就是1000+(5-1)*a[4];而在0~20中2<x(3),此时需要减去的个数就是2*a[4];
#include<bits/stdc++.h>
using namespace std;
#define int long long
int a[21];
int lifang(int a,int b){
int ans=1;
for(int i=1;i<=b;i++){
ans*=a;
}
return ans;
}//用来代替 pow 函数
signed main()
{
a[1]=0;
a[2]=1;
a[3]=19;
for(int i=4;i<=20;i++){
a[i]=lifang(10,i-2)+9*a[i-1];
}
int t;cin>>t;
while(t--){
string s;int x;
cin>>s>>x;
int n=stoll(s);
int ans=n;
for(int i=0;i<s.size();i++){
int p=s[i]-'0'; //开头数字
int q=s.size()-i-1;//后边几个0;数值=位数-1;
int t=0;
if(p>x){
t+=lifang(10,q)+(p-1)*a[q+1];
}
else if(p<x){
t+=p*a[q+1];
}
ans-=t;
}
cout<<ans+1<<endl;//自然数从0开始算,所以要+1;
}
return 0;
}
碎碎念
- 非正解的这个方法用pow函数 样例4 会WA掉:因为pow函数它是浮点类型,所以它计算很大的数字的时候,就会有浮点的误差(比如小数点后很多为突然冒出一个1,换算成整数看似没有影响,但是数字很大计算很多次的话结果就不是正确结果了),然后他就wa了;