1605: 大一下之小试身手

Description
在浙江中医药大学的半年学习,你看起来帅了很多,这个时候你已经看不上A+B了,现在你喜欢用你的代码去模拟你看到一切的事物。有一天你发现了一门神奇的语言那就是python,比如print “xxxx”*100,就可以把”xxxx”连续输出一百遍… 这个时候你表示不服,我的C语言也可以,不就是多写一个循环而已么。不开心的你于是决定用C模拟Python解释器,考虑到… 其实也没啥,现在我告诉你Python的一些常用的运算符号和规则,你来做个解释器,恩,就这样。

在Python里 “*”,”+”,”/”, ”-”,”%” 和C语言一样

           “**”表示幂运算,比如2**3==8

给你的语句如下:

               Print  string * num(string表示一个字符串,num表示一个数)

               Print  a operator  b ( 输出a ,b经过operator运算的结果)

Input

只有上述两种输入(数据在Long long 内)

Output

输出正确的答案

Sample Input

print 54*1
print "Tomcat"*2

Sample Output

54
TomcatTomcat

思路:模拟,注意细节。。。
参考博客:
https://blog.csdn.net/yu121380/article/details/81979268
https://blog.csdn.net/dream_weave/article/details/80035281

#include<vector>
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<map>
#include<algorithm>
#include<stdlib.h>

using namespace std;
typedef long long ll;
const int maxn=300050;
ll f(ll a,ll b){//快速幂 
    ll sum=1;
    while(b){
        if(b&1)sum*=a;
        a*=a;
        b>>=1;
    }
    return sum;
}
int main(){
    int n;
    char s[10005];
    char q[15];
    while(~scanf("%s",s)){
    scanf("%s",s);
    int len=strlen(s);
    char a[10005];
    
    int i=0,ans=0,num=0;   
    if(s[i]=='"'){
        i++;
        while(s[i]!='"')//右括号
        {
            a[ans++]=s[i];
            i++;
        }
        i+=2;
        for(;i<len;i++)
            num=num*10+s[i]-'0';
        a[ans]='\0';
        for(int i=0;i<num;i++)
            printf("%s",a);
        puts("");
    }
    else {
        ll a=0,b=0,c=1;
        int flag=0;
        if(s[i]=='-') c=-1,i++ ;
        while(s[i]>='0'&&s[i]<='9'){
            a=10*a+s[i]-'0';
            i++;
        }
        a*=c;
        char q=s[i];
        if(s[i+1]=='*')i++,flag=1;
        i++;
        
        c=1;
        if(s[i]=='-')c=-1,i++;
        while(s[i]>='0'&&s[i]<='9')
        {
            b=10*b+s[i]-'0';//
            i++;
            if(i>=len)break;    
        }
        b*=c;
        
        if(flag)
            printf("%lld\n",f(a,b));
        else {
            if(q=='*') printf("%lld\n",a*=b);
            else if(q=='/')printf("%lld\n",a/=b);
            else if(q=='%')printf("%lld\n",a%=b);
            else if(q=='-')printf("%lld\n",a-=b);                        else if(q=='+')printf("%lld\n",a+=b);
        }
    }
}
     return 0;
}

方法2:来自https://blog.csdn.net/dream_weave/article/details/80035281(使用sscanf())

#include<bits/stdc++.h>
 
using namespace std;
 
typedef long long ll;
 
ll power(ll a,ll b)
{
    ll ans=1;
    while(b)
    {
        if(b&1) ans*=a;
        b>>=1;
        a*=a;
    }
    return ans;
}
 
int main()
{
    ll a,b;
    char s[1000];
    while(gets(s))
    {
//        if(s[6]=='"') // (low 方法)
//        {
//            string ss=string(s);
//            int l=ss.find_first_of('"');
//            int r=ss.find_last_of('"');
//            ss=ss.replace(ss.begin()+r,ss.begin()+r+1," ");
//            ss=ss.replace(ss.begin()+l,ss.begin()+l+1,"");
//            sscanf(ss.c_str(),"print %s *%lld",ss.begin(),&b);
//            for(int i=0;i<b;i++)
//                printf("%s",ss.c_str());
//            puts("");
//            continue;
//        }
 
        ll rs; char ss[1000];
    
        if(sscanf(s,"print %lld*%lld",&a,&b)==2) rs=a*b;
        else if(sscanf(s,"print %lld+%lld",&a,&b)==2) rs=a+b;
        else if(sscanf(s,"print %lld/%lld",&a,&b)==2) rs=a/b;
        else if(sscanf(s,"print %lld-%lld",&a,&b)==2) rs=a-b;
        else if(sscanf(s,"print %lld%%%lld",&a,&b)==2) rs=a%b;
        else if(sscanf(s,"print %lld**%lld",&a,&b)==2) rs=power(a,b);
        else if(sscanf(s,"%*s \"%[^\"]\"*%lld",ss,&b)==2) 
//            print "Tomcat"*2 (推荐)
        {
//            printf("ss == %s\n",ss);
//            printf("b == %lld\n",b);
            while(b--)
                printf("%s",ss);
            puts("");
            continue;
        }
 
        printf("%lld\n",rs);
    }
    return 0;
}
全部评论

相关推荐

11-08 13:58
门头沟学院 Java
程序员小白条:竟然是蓝桥杯人才doge,还要花钱申领的offer,这么好的公司哪里去找
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务