赞
踩
isalpha(a)
判断字符a是否为字母,返回值非0表示a是字母,否则不是字母。isdigit(a)
判断字符a是否为数字。isupper(a)
判断字符a是否为大写英文字母。islower(a)
判断字符a是否为小写英文字母。toupper(a)
将字符a转换为大写字母,tolower(a)
将字符a转换为小写字母。注意头文件为<cctype>或<ctype.h>。
printf("%s\n", b[i].c_str());
。题目链接:340 - Master-Mind Hints
参考博文:340 - Master-Mind Hints
代码:
#include <iostream> #include <cstdio> #include <cstring> using namespace std; const int MAX = 1005; int N, a[MAX], b[MAX], n1[15], n2[15]; int main() { int T = 1; while(scanf("%d", &N)!=EOF && N) { memset(n1, 0, sizeof(n1)); for(int i=0; i<N; i++) { scanf("%d", &b[i]); n1[b[i]]++; } printf("Game %d:\n", T++); while(1) { int A = 0, B = 0; memset(n2, 0, sizeof(n2)); for(int i=0; i<N; i++) { scanf("%d", &a[i]); n2[a[i]]++; if(b[i]==a[i]) A++; } if(!a[0]) break; for(int i=1; i<10; i++) { B += min(n1[i], n2[i]); } B -= A; printf(" (%d,%d)\n", A, B); } } return 0; }
#include <iostream> #include <cstring> using namespace std; int T, d; bool check(int n, int t) { int a = n, b = n; while(b) { a += b%10; b /= 10; } if(a==t) return 1; else return 0; } int main() { scanf("%d", &T); while(T--) { scanf("%d", &d); int flag = 0; int st = max(0, d-50); for(int i=st; i<d; i++) { if(check(i, d)) { flag = i; break; } } if(!flag) printf("0\n"); else printf("%d\n", flag); } return 0; }
代码:
#include <iostream> #include <cstdio> #include <cstring> #include <map> using namespace std; int len, T; char s[101]; //比较以p开始的字符串和q开始的字符串那个字典序小 int Less(char s[], int p, int q) { for(int i=0; i<len; i++) { if(s[(p+i)%len]!=s[(q+i)%len]) return s[(p+i)%len]<s[(q+i)%len]; } return 0;//相等 } int main() { scanf("%d", &T); while(T--) { scanf("%s", s); int ans = 0; len = strlen(s); for(int i=1; i<len; i++) { if(Less(s, i, ans)) ans = i; } for(int i=0; i<len; i++) { printf("%c", s[(i+ans)%len]); } printf("\n"); } return 0; }
代码:
#include <iostream> #include <cstdio> #include <cctype> #include <cstring> using namespace std; const int MAX = 100; int T; char s[MAX]; int main() { scanf("%d", &T); while(T--) { scanf("%s", s); int len = strlen(s); for(int i=1; i<=len; i++) { if(len%i) continue;//周期是否可整除 int cnt = i; char a[MAX], b[MAX]; strncpy(a, s, i);//获取该周期的第一个子串 a[i] = '\0';//注意需要添加结束字符,否则C语言不认为其结束 //遍历判断该子串是否是周期子串 while(cnt<len) { strncpy(b, s+cnt, i); b[i] = '\0'; if(strcmp(a, b)!=0)//与第一个子串不同 break; cnt += i; } if(cnt==len) { printf("%d\n", i); break; } } if(T) printf("\n"); } return 0; }
题目链接:227 - Puzzle
代码:
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; char G[10][10], ch; int main() { int sx, sy, T = 1; while(1) { //注意fgets读入了回车 fgets(G[0], 10, stdin); if(strlen(G[0])<5 && G[0][0]=='Z') break; for(int i=1; i<5; i++) { fgets(G[i], 10, stdin); } for(int i=0; i<5; i++) { for(int j=0; j<5; j++) { if(G[i][j]==' ' || G[i][j]=='\n')//空格在一行的最后,可能变成了换行,需要恢复一下 { G[i][j] = ' ';//恢复 sx = i, sy = j;//获得空格起始坐标 } } } //根据指令模拟 int flag = 1; while(ch=getchar()) { if(ch=='0') break; if(!flag) continue; if(ch=='A') { if(sx-1<0) { flag = 0; continue; } swap(G[sx][sy], G[sx-1][sy]); sx--; }else if(ch=='B') { if(sx+1>=5) { flag = 0; continue; } swap(G[sx][sy], G[sx+1][sy]); sx++; }else if(ch=='L') { if(sy-1<0) { flag = 0; continue; } swap(G[sx][sy], G[sx][sy-1]); sy--; }else if(ch=='R') { if(sy+1>=5) { flag = 0; continue; } swap(G[sx][sy], G[sx][sy+1]); sy++; } } getchar(); //输出格式 if(T!=1) printf("\n"); printf("Puzzle #%d:\n", T++); if(!flag)//存在违法指令 { printf("This puzzle has no final configuration.\n"); continue; } for(int i=0; i<5; i++) { for(int j=0; j<5; j++) { if(j!=0) printf(" "); printf("%c", G[i][j]); } printf("\n"); } } return 0; }
代码:
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> using namespace std; int r, c; char G[15][15]; string a[101], b[101]; int ida[101], idb[101], id[11][11]; //判断是否是起始点 bool check_id(int x, int y) { if(G[x][y]=='*') return 0; if(x-1<0 || y-1<0) return 1; if(G[x-1][y]=='*' || G[x][y-1]=='*') return 1; return 0; } int main() { int T = 1; while(scanf("%d", &r)!=EOF && r) { //初始化所有元素为空,防止判断错误 fill(a, a+101, ""); fill(b, b+101, ""); scanf("%d", &c); getchar(); //输入 for(int i=0; i<r; i++) { fgets(G[i], 12, stdin); } //遍历得到起始点编号 int cnt = 1; for(int i=0; i<r; i++) { for(int j=0; j<c; j++) { if(check_id(i, j)) { id[i][j] = cnt++; } } } //得到Across的字符串 int cnta = 0; a[cnta] = ""; for(int i=0; i<r; i++) { for(int j=0; j<c; j++) { if(G[i][j]!='*')//遇到非*,累加字符串 { a[cnta] += G[i][j]; if(j-1<0 || G[i][j-1]=='*')//得到起始点,则取出其标号 ida[cnta] = id[i][j]; } else if(a[cnta]!="")//遇到*开始取下一个字符串 cnta++;//a[++cnta] = ""; } if(a[cnta]!="") { cnta++; //a[++cnta] = "";//换行,取下一个字符串 } } //得到Down的字符串 int cntb = 0; b[cntb] = ""; for(int i=0; i<r; i++) { for(int j=0; j<c; j++) { if(G[i][j]!='*')//遇到起始点 { int t = i; idb[cntb] = id[i][j];//取编号 while(G[t][j]!='*' && t<r)//向下遍历取字符串 { b[cntb] += G[t][j]; G[t++][j] = '*'; } cntb++; //b[++cntb] = "";//开始取下一个字符串 } } } //输出格式 if(T!=1) printf("\n"); printf("puzzle #%d:\n", T++); printf("Across\n"); for(int i=0; i<cnta; i++) { printf("%3d.", ida[i]);//注意三个宽度 printf("%s\n", a[i].c_str()); } printf("Down\n"); for(int i=0; i<cntb; i++) { printf("%3d.", idb[i]);//注意三个宽度 printf("%s\n", b[i].c_str()); } } return 0; }
题目链接:1368 - DNA Consensus String
代码:
#include <iostream> #include <cstdio> #include <cstring> #include <map> using namespace std; const int MAX = 1005; map<char, int>M; string ans, t="ACGT"; int a[MAX][5]; char s[MAX]; int n, m, len, T, num; //按字典序赋值 void Init() { M['A'] = 0, M['C'] = 1; M['G'] = 2, M['T'] = 3; } int main() { Init(); scanf("%d", &T); while(T--) { memset(a, 0, sizeof(a)); scanf("%d%d", &m, &n); getchar(); //输入并统计次数 for(int k=0; k<m; k++) { fgets(s, MAX, stdin); len = strlen(s)-1; for(int i=0; i<n; i++) a[i][M[s[i]]]++; } //筛选出每列次数最多字符,并拼接 ans = "", num = 0; for(int i=0; i<n; i++) { int MAX = a[i][0]; char cnt = t[0]; for(int j=1; j<4; j++) { if(MAX<a[i][j]) { MAX = a[i][j]; cnt = t[j]; } } ans += cnt; num += m-MAX;//累加求Ham距离 } printf("%s\n", ans.c_str());//转成char数组 printf("%d\n", num); } return 0; }
代码:
#include <iostream> #include <cstdio> #include <cstring> using namespace std; int a, b, c, ci, d, p; int modc[10000]; int Find(int modc[], int c, int n) { for(int i=0; i<n; i++) { if(c==modc[i]) { return i; } } return -1; } int main() { while(scanf("%d%d", &a, &b)!=EOF) { string frac = "";//小数位 memset(modc, 0, sizeof(modc)); ci = a/b, d = a%b; int p, cnt = 0;//p是循环节开始时的小数下标 modc[cnt++] = d;//记录余数,从获得第一位小数的余数开始记录 while(1) { if(d==0)//当可以除尽时 { frac += '0'; p = frac.size()-1; break; } c = d*10/b; d = (d*10)%b; frac += c+'0'; p = Find(modc, d, cnt);//找到重复的余数的下标,该下标对应着小数的下标 if(p!=-1) break; modc[cnt++] = d; } printf("%d/%d = %d.", a, b, ci); int n = frac.size(); for(int i=0; i<n; i++) { if(i==50)//超出50位 { printf("..."); break; } if(i==p) printf("(");//开始循环 printf("%c", frac[i]); } printf(")\n"); int r = n-p;//循环节长度 printf(" %d = number of digits in repeating cycle\n\n", r); } return 0; }
题目链接:10340 - All in All
代码:
#include <iostream> #include <cstdio> #include <cstring> using namespace std; const int MAX = 100005; char s1[MAX+1], s2[MAX+1]; int main() { while(scanf("%s%s", s1, s2)!=EOF) { int len1 = strlen(s1), len2 = strlen(s2), cnt = 0, i, j; for(i=0; i<len1; i++) { for(j=cnt; j<len2; j++) { if(s1[i]==s2[j])//相等 { cnt = j+1;//记录下一次s2开始遍历的下标 break; } } if(j==len2) break;//s2已经遍历完了,但s1还没有 } if(i==len1)//s1所有字符均在s2中按序排列 printf("Yes\n"); else printf("No\n"); } return 0; }
题目链接:1587 - Box
代码:
#include <iostream> #include <cstdio> #include <algorithm> using namespace std; pair<int, int>u[10]; int main() { while(scanf("%d%d", &u[0].first, &u[0].second)!=EOF) { if(u[0].first>u[0].second) swap(u[0].first, u[0].second);//统一first不能大于second for(int i=1; i<6; i++) { scanf("%d%d", &u[i].first, &u[i].second); if(u[i].first>u[i].second) swap(u[i].first, u[i].second); } sort(u, u+6); int flag =1; for(int i=0; i<6; i+=2)//判断只存在三种关系 { if(u[i].first!=u[i+1].first || u[i].second!=u[i+1].second) { flag = 0; break; } } //判断是否这三种关系是ab,ac,bc if(u[0].first!=u[2].first || u[0].second!=u[4].first || u[2].second!=u[4].second) flag = 0; if(flag) printf("POSSIBLE\n"); else printf("IMPOSSIBLE\n"); } return 0; }
题目链接:1588 - Kickdown
代码:
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> using namespace std; string s1, s2; int len1, len2, Max; void solve(string s1, string s2) { Max = len1+len2; //完全重合的情况,即Max等于最大的一个序列的长度 for(int i=0; i<=len1-len2; i++) { int j; for(j=i; j<i+len2; j++) { if(s2[j-i]+s1[j]-'0'-'0'>3) break; } if(j==i+len2) { Max = len1; break; } } if(Max==len1) { printf("%d\n", Max); return; } //重合度从大到小遍历,得到最大重合度,则Max=len1+len2-i for(int i=len2-1; i>=1; i--) { int j; for(j=len2-i; j<len2; j++) { if(s2[j]+s1[j-len2+i]-'0'-'0'>3) break; } if(j==len2) { Max -= i; break; } for(j=i-1; j>=0; j--) { if(s2[j]+s1[len1-i+j]-'0'-'0'>3) break; } if(j==-1) { Max -= i; break; } } printf("%d\n", Max); } int main() { while(getline(cin, s1)) { getline(cin, s2); //确保第二个一定最小 if(s1.size()<s2.size()) swap(s1, s2); len1 = s1.size(), len2 = s2.size(); solve(s1, s2); } return 0; }
题目链接:11809 - Floating-Point Numbers
参考博文:UVa 11809 Floating-Point Numbers(浮点数)
参考博文:UVA - 11809(Floating-Point Numbers)
代码:
#include <stdio.h> #include <string.h> #include <math.h> #define max1 15 #define max2 35 #define min_diff 1e-5//设置误差 double M[max1][max2];//存储对应尾数 long long E[max1][max2];//存对应指数 void solve(double m, long long e) { int flag = 0; for(int i=0; i<10; i++) { for(int j=1; j<=30; j++) { if(e==E[i][j] && fabs(m-M[i][j])<min_diff) { flag = 1; printf("%d %d\n", i, j); break; } } if(flag) break; } } int main() { double m, t; long long e; char s[500]; for(int i=0; i<10; i++) { //完全按照公式打表 for(int j=1; j<=30; j++) { e = (1<<j)-1; m = 1-1.0/(1<<(i+1)); t = log10(m) + e*log10(2); E[i][j] = t/1; M[i][j] = pow(10,t-E[i][j]); } } while(scanf("%s", s)==1 && strcmp(s,"0e0")) { *(strchr(s,'e'))=' '; //将字符串中的e替换成空格 sscanf(s,"%lf %lld", &m, &e); solve(m,e); } return 0; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。