Logo 快乐的熊果的博客

博客

GESPC++4级编程题题解

2023-09-23 12:36:29 By 快乐的熊果

前言:目前只做了第一题,第二题后面补罢。

第一题:

题目描述(很像#376):

输入一个整数N,在输入N行,每行有一个K(2<=K<=16),还有一个K进制的M(最多只有9位)。要求输出M的十进制。(经过简化,等真题出来再改)

转换进制很简单,如下(照抄#376):比如(10101)2 ,那么它的十进制表示的式子就是 :1X2^4+0X2^3+1X2^2+0X2^1+1X2^0,

根据此思路,我们就可以写出这样的代码(有些思路没有写出,代码里有注释):

#include <bits/stdc++.h>//万能头文件 
using namespace std;
int main(){
    int n;
    cin>>n;
    int k;
    string m;
    for(int i=1;i<=n;i++){
        cin>>k>>m;
        int t=0;//第几位
        int sum=0;//结果
        int t2=0;//因为是字符串,要转成数字
        int t3=0;//临时打工仔
        for(int j=m.size()-1;j>=0;j--){//从后面开始 
            if((int)(m[j]-'0')>=0&&(int)(m[j]-'0')<=9){//如果是数字 
                t2=(int)(m[j]-'0');
            }
            else{//大于十 
                if(m[j]=='A'){
                    t2=10;
                }
                if(m[j]=='B'){
                    t2=11;
                }
                if(m[j]=='C'){
                    t2=12;
                }
                if(m[j]=='D'){
                    t2=13;
                }
                if(m[j]=='E'){
                    t2=14;
                }
                if(m[j]=='F'){//最多只到16进制 
                    t2=15;
                }
            }
            t3=pow(k,t);//pow(n,k)=n的k次方,需要cmath头文件
            sum+=t2*t3;
            t++;
        }
        cout<<sum;//输出结果 
    }
}

测试数据完美通过,可是交上去1分没有,也没有其他错误呀?

想想xushuoxin说的话:十年OI一场空,不开long long 见祖宗。

上面说过,最多有9位数字,如果是16进制那就是16的9次方,最大情况就是15X6的9次方,就是15461882265600。而int只能存放2147483647的数据。远远超过了int的最大范围。

所以要开long long!

不AC代码

#include <bits/stdc++.h>//万能头文件 
using namespace std;
int main(){
    int n;
    cin>>n;
    int k;
    string m;
    for(int i=1;i<=n;i++){
        cin>>k>>m;
        long long t=0;//第几位
        long long sum=0;//结果
        long long t2=0;//因为是字符串,要转成数字
        long long t3=0;//临时打工仔
        for(int j=m.size()-1;j>=0;j--){//从后面开始 
            if((int)(m[j]-'0')>=0&&(int)(m[j]-'0')<=9){//如果是数字 
                t2=(int)(m[j]-'0');
            }
            else{//大于十 
                if(m[j]=='A'){
                    t2=10;
                }
                if(m[j]=='B'){
                    t2=11;
                }
                if(m[j]=='C'){
                    t2=12;
                }
                if(m[j]=='D'){
                    t2=13;
                }
                if(m[j]=='E'){
                    t2=14;
                }
                if(m[j]=='F'){//最多只到16进制 
                    t2=15;
                }
            }
            t3=pow(k,t);//pow(n,k)=n的k次方,需要cmath头文件
            sum+=t2*t3;
            t++;
        }
        cout<<sum;//输出结果 
    }
}

但是为什么交上去还是0分啊!

哦忘记加endl了

真·完结撒花(不喜勿喷)

#include <bits/stdc++.h>//万能头文件 
using namespace std;
int main(){
    int n;
    cin>>n;
    int k;
    string m;
    for(int i=1;i<=n;i++){
        cin>>k>>m;
        long long t=0;//第几位
        long long sum=0;//结果
        long long t2=0;//因为是字符串,要转成数字
        long long t3=0;//临时打工仔
        for(int j=m.size()-1;j>=0;j--){//从后面开始 
            if((int)(m[j]-'0')>=0&&(int)(m[j]-'0')<=9){//如果是数字 
                t2=(int)(m[j]-'0');
            }
            else{//大于十 
                if(m[j]=='A'){
                    t2=10;
                }
                if(m[j]=='B'){
                    t2=11;
                }
                if(m[j]=='C'){
                    t2=12;
                }
                if(m[j]=='D'){
                    t2=13;
                }
                if(m[j]=='E'){
                    t2=14;
                }
                if(m[j]=='F'){//最多只到16进制 
                    t2=15;
                }
            }
            t3=pow(k,t);//pow(n,k)=n的k次方,需要cmath头文件
            sum+=t2*t3;
            t++;
        }
        cout<<sum<<endl;//输出结果 
    }
}

提醒:禁止抄袭(好像网站上还没这题)

评论

快乐的熊果
@zuotingting
zuotingting
写的很好,继续努力
zuotingting
期待第二题
Andy0815
牛*啊,熊果
Maguoming2012
yoxi axiba

发表评论

可以用@mike来提到mike这个用户,mike会被高亮显示。如果你真的想打“@”这个字符,请用“@@”。