头像

夏海藻




离线:2天前


最近来访(7)
用户头像
RE_MAKE
用户头像
谁与我煮酒论天下
用户头像
21KINGDMG
用户头像
第一万零一次AC
用户头像
蔡大侠_9
用户头像
君冕
用户头像
Copupil



解释在注释中

最重要的是使用 C艹 的输入输出流,可以很方便的取到需要的数据,可以简化很多工作,就是说 C艹 语法基础还是很重要的,C++ primer 还是得多翻看翻看

C++ 代码

#include <iostream>
#include <sstream>
using namespace std;


char names[][5] = {
    "tret", "jan", "feb", "mar", "apr", "may", "jun", "jly", "aug", "sep", "oct", "nov", "dec",
    "tam", "hel", "maa", "huh", "tou", "kes", "hei", "elo", "syy", "lok", "mer", "jou",
};

int get(string word)
{
    for(int i=0;i<25;i++)
    {
        if(names[i]==word)
        {
            if(i<13)
            {
                //如果是小于十三进制的个位数,就直接转换
                return i;
            }
            //否则就需要进位后再转换,因为数据要求确保了一定是两位数
            return(i-12)*13;
        }
    }
    //表示转化失败,没有找到合适的数字
    return -1;
}

int main()
{
    //读入n 行
    int n;
    cin>>n;
    getchar();  //读入该输入后面的 回车符

    //流的输出输出操作,可以更方便的进行格式化转换
    while(n--)
    {
        string line;
        getline(cin,line);

        stringstream ssin(line);

        if(line[0]<='9')
        {
            //输入的是数字
            int v;
            ssin>>v;    //从输入流中取出 int 型的值
            if(v<13)
            {
                //如果小于13 就可以直接输出
                cout<<names[v]<<endl;
            }
            else
            {
                //大于十三的就先输出十位
                cout<<names[12+v/13];
                if(v%13==0)
                {
                    //如果没有个位,转换就结束
                    cout<<endl;
                }
                else
                {
                    //输出个位
                    cout<<" "<<names[v%13]<<"\n";
                }
            }
        }
        else
        {
            //输入的是火星文
            int res=0;
            string word;
            while(ssin>>word)   //从输入流中取出 string 型的值
            {
                //将火星文转化成数字
                res+=get(word);
            }
            cout<<res <<"\n";

        }


    }




    return 0;
}


活动打卡代码 AcWing 1590. 火星数字

#include <iostream>
#include <sstream>
using namespace std;


char names[][5] = {
    "tret", "jan", "feb", "mar", "apr", "may", "jun", "jly", "aug", "sep", "oct", "nov", "dec",
    "tam", "hel", "maa", "huh", "tou", "kes", "hei", "elo", "syy", "lok", "mer", "jou",
};

int get(string word)
{
    for(int i=0;i<25;i++)
    {
        if(names[i]==word)
        {
            if(i<13)
            {
                //如果是小于十三进制的个位数,就直接转换
                return i;
            }
            //否则就需要进位后再转换,因为数据要求确保了一定是两位数
            return(i-12)*13;
        }
    }
    //表示转化失败,没有找到合适的数字
    return -1;
}

int main()
{
    //读入n 行
    int n;
    cin>>n;
    getchar();  //读入该输入后面的 回车符

    //流的输出输出操作,可以更方便的进行格式化转换
    while(n--)
    {
        string line;
        getline(cin,line);

        stringstream ssin(line);

        if(line[0]<='9')
        {
            //输入的是数字
            int v;
            ssin>>v;
            if(v<13)
            {
                //如果小于13 就可以直接输出
                cout<<names[v]<<endl;
            }
            else
            {
                //大于十三的就先输出十位
                cout<<names[12+v/13];
                if(v%13==0)
                {
                    //如果没有个位,转换就结束
                    cout<<endl;
                }
                else
                {
                    //输出个位
                    cout<<" "<<names[v%13]<<"\n";
                }
            }
        }
        else
        {
            //输入的是火星文
            int res=0;
            string word;
            while(ssin>>word)
            {
                //将火星文转化成数字
                res+=get(word);
            }
            cout<<res <<"\n";

        }


    }




    return 0;
}




解释在注释中

C++ 代码

#include <iostream>

using namespace std;

char get(int x)
{
    if(x<=9)
    {
        //转换成字符
        return '0'+x;
    }
    return 'A'+x-10;
}

int main()
{
    //读入给定的三个数字
    int a[3];
    for(int i=0;i<3;i++)
    {
        cin>>a[i];
    }

    //先输出规定的一个符号
    cout<<"#";

    for(int i=0;i<3;i++)
    {
        //转化成13进制  逆序取余法 因为数据要求,就是两位的13 进制数,所以这样就可了
        cout<<get(a[i]/13)<<get(a[i]%13);
    }


    return 0;
}


活动打卡代码 AcWing 1504. 火星颜色

#include <iostream>

using namespace std;

char get(int x)
{
    if(x<=9)
    {
        //转换成字符
        return '0'+x;
    }
    return 'A'+x-10;
}

int main()
{
    //读入给定的三个数字
    int a[3];
    for(int i=0;i<3;i++)
    {
        cin>>a[i];
    }

    //先输出规定的一个符号
    cout<<"#";

    for(int i=0;i<3;i++)
    {
        //转化成13进制  逆序取余法 因为数据要求,就是两位的13 进制数,所以这样就可了
        cout<<get(a[i]/13)<<get(a[i]%13);
    }


    return 0;
}



解释在注释中

C++ 代码

#include <iostream>

using namespace std;

//判断一个数字是不是质数
bool isPrime(int n)
{
    //1 不是质数
    if(n==1) return false;

    for(int i=2;i*i<=n;i++)
    {
        if(n%i==0)
        {
            return false;
        }
    }
    return true;
}

//数字反转后,是否是质数
bool check(int n,int d)
{
    //不是质数
    if(!isPrime(n)) return false;
    //这里也不需要使用long long  进行存储
    int r=0;
    //将三步合并为一步:转换成d进制 - 反转 - 转换成10 进制  
    //因为 根据逆序取余法,n在d进制下的最后一位就是 n%d 
    //反转之后,该位就是第一位了
    //然后再转换成十进制过程中(使用秦九韶算法),第一位就是最先参与计算的
    while(n)
    {
        r=r*d+n%d;
        n/=d;
    }

    return isPrime(r);
}

int main()
{
    int n,d;
    //逗号表达式,条件判断的是最后一个条件
    while(cin>>n>>d,n>=1)
    {
        if(check(n,d))
        puts("Yes");
        else
        {
            puts("No");
        }
    }

    return 0;
}


活动打卡代码 AcWing 1492. 可逆质数

#include <iostream>

using namespace std;

//判断一个数字是不是质数
bool isPrime(int n)
{
    //1 不是质数
    if(n==1) return false;

    for(int i=2;i*i<=n;i++)
    {
        if(n%i==0)
        {
            return false;
        }
    }
    return true;
}

//数字反转后,是否是质数
bool check(int n,int d)
{
    //不是质数
    if(!isPrime(n)) return false;
    //这里也不需要使用long long  进行存储
    int r=0;
    //将三步合并为一步:转换成d进制 - 反转 - 转换成10 进制  
    //因为 根据逆序取余法,n在d进制下的最后一位就是 n%d 
    //反转之后,该位就是第一位了
    //然后再转换成十进制过程中(使用秦九韶算法),第一位就是最先参与计算的
    while(n)
    {
        r=r*d+n%d;
        n/=d;
    }

    return isPrime(r);
}

int main()
{
    int n,d;
    //逗号表达式,条件判断的是最后一个条件
    while(cin>>n>>d,n>=1)
    {
        if(check(n,d))
        puts("Yes");
        else
        {
            puts("No");
        }
    }

    return 0;
}




还是有点迷糊

这题还得好好看看

C++ 代码

#include <iostream>

using namespace std;

//因为数据要求最大到36进制,使用long long  可以防止溢出
typedef long long LL;

//将数字字符转换成 数字
int get(char c)
{
    if(c<='9')
    {
        return c-'0';
    }
   // 如果不是个位数,比如十六进制下的 A
    return c-'a'+10;
}

//将r 进制转化为10 进制
LL calc(string n,LL r)
{
    //秦九韶 算法,将任意进制,转化成10进制(就是一个提取公因式的过程)
    LL res=0;
    for(auto c:n)
    {
        if((double)res*r+get(c)>1e16)
        {
            return 1e18;
        }
        res=res*r+get(c);
    }
    return res;
}

int main()
{
    //读入两个数字字符串
    string n1,n2;
    cin>>n1>>n2;
    //读入进制
    int tag,radix;
    cin>>tag>>radix;

    //将n1 固定为确定进制,方便 寻找 n2 进制
    if(tag==2)
    {
        swap(n1,n2);
    }

    LL target=calc(n1,radix);

    //二分查找合适进制  36ll longlong 类型的36
    LL l=0,r=max(target,36ll);
    for(auto c:n2)
    {
        l=max(l,(LL)get(c)+1);
    }

    while(l<r)
    {
        LL mid=l+r>>1;
        if(calc(n2,mid)>=target)
        {
            r=mid;
        }
        else
        {
            l=mid+1;
        }
    }

    if(calc(n2,r)!=target)
    {
        puts("Impossible");
    }
    else
    {
        cout<<r<<"\n";
    }

    return 0;
}





思路都在注释中

C++ 代码

#include <iostream>
#include <vector>
using namespace std;

bool check(vector<int>& num)
{
    for(int i=0,j=num.size()-1;i<j;i++,j--)
    {
        if(num[i]!=num[j])
        {
            return false;
        }

    }
    return true;
}

vector<int> add(vector<int>& a,vector<int>& b)
{
    //存放结果 
    vector<int> result;
    int k=0;    //表示进位
    int sum;    //表示各位的和
    for(int i=0;i<a.size()||i<b.size();i++)
    {
        sum=a[i]+b[i]+k;
        result.push_back(sum%10);
        k=sum/10;   //保留进位




    }
    if(k)
    {
        result.push_back(k);
    }

    /*//通用的写法是这样的,就是可以做点优化:如果一个数字比较短,我们判断一下,就不再加了,而直接用长的那个和进位做加法就可以了
    for (int i = 0, t = 0; i < a.size() || i < b.size() || t; i ++ )
    {
        int s = t;  //s 为各位的和,t 为进位
        if (i < a.size()) s += a[i];
        if (i < b.size()) s += b[i];
        //只放入各位和的个位
        c.push_back(s % 10);
        //下一位进位
        t = s / 10;
    }*/

    return result;


}

int main()
{
    //给定整数
    string n;
    //最大操作次数
    int k;
    cin>>n>>k;

    vector<int> a;
    for(int i=n.size()-1;i>=0;i--)
    {
        a.push_back(n[i]-'0');
    }

    //判断次数
    int cnt=0;
    //不是回文数,就进行配对
    if(!check(a))
    {
        while(cnt<k)
        {
            //将给定整数反转,倒序遍历a,然后放入b 中
            vector<int> b(a.rbegin(),a.rend());
            a=add(a,b);
            cnt++;
            if(check(a))
            {
                break;
            }
        }
    }
    //是回文数就直接输出
    for(int i=a.size()-1;i>=0;i--)
    {
        cout<<a[i];
    }
    cout<<"\n"<<cnt<<"\n";


    return 0;
}


活动打卡代码 AcWing 1501. 回文数

#include <iostream>
#include <vector>
using namespace std;

bool check(vector<int>& num)
{
    for(int i=0,j=num.size()-1;i<j;i++,j--)
    {
        if(num[i]!=num[j])
        {
            return false;
        }

    }
    return true;
}

vector<int> add(vector<int>& a,vector<int>& b)
{
    //存放结果 
    vector<int> result;
    int k=0;    //表示进位
    int sum;    //表示各位的和
    for(int i=0;i<a.size()||i<b.size();i++)
    {
        sum=a[i]+b[i]+k;
        result.push_back(sum%10);
        k=sum/10;   //保留进位




    }
    if(k)
    {
        result.push_back(k);
    }

    /*//通用的写法是这样的,就是可以做点优化:如果一个数字比较短,我们判断一下,就不再加了,而直接用长的那个和进位做加法就可以了
    for (int i = 0, t = 0; i < a.size() || i < b.size() || t; i ++ )
    {
        int s = t;  //s 为各位的和,t 为进位
        if (i < a.size()) s += a[i];
        if (i < b.size()) s += b[i];
        //只放入各位和的个位
        c.push_back(s % 10);
        //下一位进位
        t = s / 10;
    }*/

    return result;


}

int main()
{
    //给定整数
    string n;
    //最大操作次数
    int k;
    cin>>n>>k;

    vector<int> a;
    for(int i=n.size()-1;i>=0;i--)
    {
        a.push_back(n[i]-'0');
    }

    //判断次数
    int cnt=0;
    //不是回文数,就进行配对
    if(!check(a))
    {
        while(cnt<k)
        {
            //将给定整数反转,倒序遍历a,然后放入b 中
            vector<int> b(a.rbegin(),a.rend());
            a=add(a,b);
            cnt++;
            if(check(a))
            {
                break;
            }
        }
    }
    //是回文数就直接输出
    for(int i=a.size()-1;i>=0;i--)
    {
        cout<<a[i];
    }
    cout<<"\n"<<cnt<<"\n";


    return 0;
}


活动打卡代码 AcWing 1500. 趣味数字

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;

int main()
{
    //获取输入的字符串,将其转换成数字进行计算
    string A;
    vector<int> a;
    cin>>A;
    for(int i=A.size()-1;i>=0;i--)
    {
        a.push_back(A[i]-'0');
    }

    //存放翻倍后的数字的容器
    vector<int> b;
    //进位
    int t=0;
    for(int i=0;i<a.size();i++)
    {
        int s=a[i]+a[i]+t;
        //每次只放入个位,保留进位到到下一位参与计算
        b.push_back(s%10);
        //用来进位的十位
        t=s/10;
    }
    //最后一个进位,如果有就放进去,没有就不管了
    if(t)
    {
        b.push_back(t);
    }

    //暂存 翻倍后的结果
    vector<int> tmp=b;
    sort(a.begin(),a.end());
    sort(b.begin(),b.end());

    if(a==b)
    {
        cout<<"Yes"<<"\n";
    }
    else
    {
        cout<<"No"<<"\n";
    }

    //倒序输出数字
    for(int i=tmp.size()-1;i>=0;i--)
    {
        cout<<tmp[i];
    }

    return 0;
}