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;
}