我就学gigo巨巨,懒得放题了 顺便推荐一下他的博客他的博客
这三道巨简单的字符串菜题,在跟我比谁更菜的比赛中失败了 于是我都没有切掉
字符串啊,字符串啊。 字符串就是坑多!
spojP2095 我忽略了一个情况: ?不在末尾,但值为10的时候如果成立,是错的情况 要多多注意特殊情况啊! 先附上zgs的不会漏情况的代码
#include<iostream> #include<cstring> #include<cstdio> using namespace std; char s[10]; int i,k,sum = 0,ans = -1; int main() { freopen("isbn.in","r",stdin); freopen("isbn.out","w",stdout); cin >> s; //读入字符串 for(i = 0;i < strlen(s);++i) //枚举每个字符 if(s[i] >= '0' && s[i] <= '9') //如果是数字字符 sum += (10 - i) * (s[i] - '0'); //数字求和 else if(s[i] == 'X') //如果最后一位是X sum += (10 - i) * 10; //用X求和 else k = i; //如果是?,则记录?的位置 for(i = 0;i < 10;i++) //用0~9尝试放在?位置 if((sum + (10 - k) * i) % 11 == 0) //满足条件 ans = i; //记录答案 if(k == 9 && (sum + (10 - 9) * 10) % 11 == 0) //如果缺的位置是最后一个 ans = 10; //该位置为10,后面要用X换10 if(ans < 10) cout << ans << endl; else cout << "X" << endl; return 0; }zgs的代码好丑不容易出错 总结一下,避免这个漏洞的方法就是特殊情况不要并入一般情况考虑 只有一种情况是会有X的,那就只在这里讨论X,而不在其他9个地方讨论 避免出错
然后附上我的英俊帅气风姿潇洒干净整洁明了易懂的代码
#include<bits/stdc++.h> using namespace std; #define re register int main(){ // freopen("isbn.in","r",stdin); // freopen("isbn.out","w",stdout); char ch[11],c; int sum=0,p; for(re int i=1;i<=10;i++)ch[i]=getchar(); for(re int i=1;i<=10;i++){ c=ch[i]; if(c>='0'&&c<='9'){ sum+=(c-48)*(11-i)%11; } if(c=='?'){ p=11-i; } if(c=='X'&&i==10){ sum+=10*(11-i)%11; } } bool v=false; for(re int i=0;i<=10;i++) if((sum+i*p)%11==0){ if(i==10&&p==1)printf("X"); else{ if(i!=10)printf("%d\n",i); else break; } v=true; break; } if(!v)printf("-1"); return 0; }spojP213 sgz的网站有一个好处就是它能显示Presentation Error 于是这道题我PE了两个(好妙啊,体育,我的最恨) 然后有一改,PE了3个。。。 下去跑3圈以示惩罚
zgs用的是gets,好讨厌的读一行 然鹅我最后还是妥协了 字符串啊,天天PE
#include<bits/stdc++.h> using namespace std; #define re register #define NNN 100010 inline bool Letter(char ch){//可以调用isalpha(),但是一般来说自己写的要快一点 return (ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'); } int main(){ // freopen("str.in","r",stdin); // freopen("str.out","w",stdout); char ch[NNN],ans[NNN]; int p=0,v=0; while(gets(ch)){ p=strlen(ch); for(re int i=0;i<p;i++){ if(Letter(ch[i]))ans[++v]=ch[i]; else if(Letter(ch[i-1]))ans[++v]=' '; } if(Letter(ch[p-1]))ans[++v]=' '; } ans[++v]='\0'; puts(ans+1);//puts只输出'\0'前面的字符。 '\0'标志字符串结束 return 0; }lgojP1012 不能按字典序!!! 反例:12311 123 按字典序:12311123 实际答案:12312311
联系字符串,可以用string来解决——string可以直接比较大小 这样做
bool comp(string a,string b){ \quad return a>b }
这里上标程
#include<bits/stdc++.h> using namespace std; #define re register #define NNN 1010 string num[NNN]; int n; bool comp(const string &a,const string &b){ return (a+b)>(b+a); } int main(){ cin>>n; for(re int i=1;i<=n;i++)cin>>num[i]; sort(num+1,num+n+1,comp); for(re int i=1;i<=n;i++)cout<<num[i]; return 0; }既简洁又完美
然后这个是我的按字典序来的代码(当然是错的)
#include<bits/stdc++.h> using namespace std; #define in Read() #define re register int n; struct st{ int num,val[11]; }a[50]; inline int in{ int i=0,f=1;char ch; while((ch>'9'||ch<'0')&&ch!='-')ch=getchar(); if(ch=='-'){ ch=getchar();f=-1; } while(ch>='0'&&ch<='9')i=(i<<1)+(i<<3)+ch-48,ch=getchar(); return i*f; } inline void Load(){ for(re int i=1;i<=n;i++){ // printf("%d ",i); int x=a[i].num; int y=0; while(x){ y=(y<<1)+(y<<3)+(x%10); x/=10; } // printf("%d %d ",a[i].num,y); int p=0; while(y) a[i].val[++p]=y%10,y/=10; // printf("\n"); } // printf("\n"); } inline bool comp(const st &a,const st &b){ for(re int i=1;i<=10;i++) if(a.val[i]!=b.val[i]) return a.val[i]>b.val[i]; } int main(){ // freopen("connect.in","r",stdin); // freopen("connect.out","w",stdout); n=in; for(re int i=1;i<=n;i++)a[i].num=in; Load(); sort(a+1,a+n+1,comp); for(re int i=1;i<=n;i++)printf("%d",a[i]); return 0; }