如题(水题大集锦)
1.P1914 小书童——密码
思路:
因为是循环的,所以我们进行%26即可
上代码:
#include <iostream> #include <cstdio> using namespace std; const int Mod = 26; const char e[Mod] = {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'}; int n; string y; int main() { scanf("%d",&n); cin>>y; int len=y.length(); for(int i=0,d; i<len; i++) { d=(y[i]-'a'+n)%26; printf("%c",e[d]); } return 0; }
2.P1200 [USACO1.1]你的飞碟在这儿Your Ride Is He…
(Maybe是Here。。)
思路:
将字符串转化为数字之后,边乘边模即可
坑点:
注意ret的初始值应该设置为1,而不是0,因为用到了乘
上代码:
#include <iostream> #include <cstdio> #include <cstring> using namespace std; const int Mod = 47; char s[10],p[10]; int UFO(char a[],int len) { int ret=1; for(int i=0,x; i<len; i++) { x=a[i]-'A'+1; ret=ret*x%Mod; } return ret; } int main() { cin>>s>>p; int lens=strlen(s),lenp=strlen(p); if(UFO(s,lens)==UFO(p,lenp)) printf("GO"); else printf("STAY"); return 0; }
3.P1022 计算器的改良
思路:
我们可以根据一系列操作使得所有常数的和在等号右面,其余的系数之和位于等号左端,即k1*x=k2——>x=k2/k1
我们可以定义一个p表示x的正负,lef表示在等号的左端还是右端
坑点:
①注意x要初始化为零
②注意可能会出现ans=-0的情况。。。(为什么会出现这种情况?强大。。。)
上代码:
#include <iostream> #include <cstdio> #include <cstring> using namespace std; int k1,k2; char q,s[2333]; int main() { scanf("%s",s); int len=strlen(s); s[len]='='; //便于计算最后一步的结果 bool p=true,lef=true; for(int i=0,x=0; i<=len; i++) { if('0'<=s[i] && s[i]<='9') x=x*10+s[i]-'0'; //如果是数,更新x if(s[i]>='a') { q=s[i]; //记录出现的字母 //x==0 ? 1 : x 是处理字母的系数为1的情况 k1+=(x==0 ? 1 : x)*(lef ? (p ? 1 : (-1)) : (p ? (-1) : 1)); } if(s[i]=='+' || s[i]=='-' || s[i]=='=') { if('0'<=s[i-1] && s[i-1]<='9') //判断一下是否是常数 k2+=x*(lef ? (p ? (-1) : 1) : (p ? 1 : (-1))); x=0; //记住这里一定要清零!!! if(s[i]=='=') lef=false; //表示位于右端 if(s[i]=='-') p=false; else p=true; } } double ans=(double)(k2)/(double)(k1); if(ans==0) printf("%c=0.000",q); //可以试一下,如果把这一句注释掉,会出现很奇怪的现象 else printf("%c=%.3lf",q,ans); return 0; }