数字实验

题目传送门

整体思路:数学+大模拟

不难发现,当n≥100时,结尾会有18个0。
这个时候只需要输出k个0即可(因为k不大于18)

判断代码如下

    cin>>s>>k;//s是数字,用字符串存储
    int l=s.size();
    if(l>3){
        for(int i=1;i<=k;i++) cout<<0;
        cout<<endl;
        return ;
    }
    int n=stoi(s);
    if(n>=100){
    	for(int i=1;i<=k;i++) cout<<0;
        cout<<endl;
        return ;
	}

当时比赛的时候,我的代码是0分
长这样

#include<bits/stdc++.h>
using namespace std;

using ll=long long;
using pii=pair<int,int>;
using pll=pair<ll,ll>;
#define endl '\n';

void gmin(int &x,int y){x=min(x,y);}
void gmax(int &x,int y){x=max(x,y);}
string pt(int st,bool x){return st==1?x?"Yes":"No":x?"YES":"NO";}

string s;
int k;

void solve(){
    cin>>s>>k;
    int l=s.size();
    if(l>3){
        for(int i=1;i<=k;i++) cout<<0;
        cout<<endl;
        return ;
    }
    int n=stoi(s);
    long long p=pow(10,k);
    int sum=1;
    for(int i=1;i<=n;i++){
        sum*=i;
        sum%=p;
    }
    int m=sum;
    int di=0;
    while(m) di++,m/=10;
    if(di<k){
        for(int i=1;i<=k-di;i++) cout<<0;
    }
    cout<<sum<<endl;
}

int main(){
    cin.tie(0)->sync_with_stdio(0);
    int t=1;
    cin>>t;
    while(t--) solve();
}

首先,在最后输答案的时候,如果答案是0,那么我的程序会输出00,因为我代码认为0没有位数,所以要补一个零。因为循环的条件就是这样的。
所以,需要加一条特判

代码如下

#include<bits/stdc++.h>
using namespace std;

using ll=long long;
using pii=pair<int,int>;
using pll=pair<ll,ll>;
#define endl '\n';

void gmin(int &x,int y){x=min(x,y);}
void gmax(int &x,int y){x=max(x,y);}
string pt(int st,bool x){return st==1?x?"Yes":"No":x?"YES":"NO";}

string s;
int k;

void solve(){
    cin>>s>>k;
    int l=s.size();
    if(l>3){
        for(int i=1;i<=k;i++) cout<<0;
        cout<<endl;
        return ;
    }
    int n=stoi(s);
    long long p=pow(10,k);
    int sum=1;
    for(int i=1;i<=n;i++){
        sum*=i;
        sum%=p;
    }
    int m=sum;
    int di=0;
    //特判 
    if(m==0) di=1;
    //特判位置一定要放对
    while(m) di++,m/=10;
    //如果特判放在这里,那么只有10分
    if(di<k){
        for(int i=1;i<=k-di;i++) cout<<0;
    }
    cout<<sum<<endl;
}

int main(){
    cin.tie(0)->sync_with_stdio(0);
    int t=1;
    cin>>t;
    while(t--) solve();
}

这样便可以获得三十分
因为爆long long

如何避免呢?

1.数据类型开大一点,就可以了
当然我不是很会
2.可以把乘法拆开来,变成加法,边加边取模。
这个方法更有道理
我后来补题用的是第二种方法
代码如下

#include<bits/stdc++.h>
using namespace std;

using ll=long long;
using pii=pair<int,int>;
using pll=pair<ll,ll>;
#define endl '\n';

void gmin(int &x,int y){x=min(x,y);}
void gmax(int &x,int y){x=max(x,y);}
string pt(int st,bool x){return st==1?x?"Yes":"No":x?"YES":"NO";}

string s;
int k;

void solve(){
    cin>>s>>k;
    int l=s.size();
    if(l>3){
        for(int i=1;i<=k;i++) cout<<0;
        cout<<endl;
        return ;
    }
    int n=stoi(s);
    if(n>=100){
    	for(int i=1;i<=k;i++) cout<<0;
        cout<<endl;
        return ;
	}
    long long p=pow(10,k);
    long long ans=1;
    for(int i=1;i<=n;i++){
        long long cnt=ans;
        for(int j=1;j<i;j++){
            ans+=cnt;
            ans%=p;
        }
    }
    long long m=ans;
    int di=0;
	if(m==0) di=1;
    while(m) di++,m/=10;
    if(di<k){
        for(int i=1;i<=k-di;i++) cout<<0;
    }
    cout<<ans<<endl;
}

int main(){
    cin.tie(0)->sync_with_stdio(0);
    int t=1;
    cin>>t;
    while(t--) solve();
}

这个题目还是比较可惜的!

posted @ 2026-01-24 11:35  zhangruotian_Max  阅读(1)  评论(0)    收藏  举报