WERTYU
- 常量数组:并不需要指明大小,编译器可以完成计算
回文词
- 使用常量数组
- 不会输入空格,可以安全的使用scanf
- isalpha, idigit, isprint...在ctype.h中定义,toupper, tolower等工具可以用来转换大小写。
猜数字游戏
- scanf("%d",&a[i]);
生成元
x+x的各个数字之和得到y,说明x是y的生成元,给出n(1,100000),求最小生成元。无解输出0;
- 只需要一次枚举100000内的所有正整数,标记"m+m的各个数字之和得到的数有一个生成元是m",最后查表
- 即找出这个数是哪个数的最小生成元。
-
#include<stdio.h> #include<string.h> #define maxn 1000005 int ans[maxn]; int main() { int T,n; memset(ans,0,siezeof(ans)); for(int m=1;m<maxn;m++) { int x=m,y=m; while(x>0) { y+=x%10; x/=10; } if(ans[y]==0||m<ans[y]) ans[y]=m; } scanf("%d",&T); while(T--) { scanf("%d",&n); printf("%d ",ans[n]); } return 0; }
环状序列
- Q: 长度为n(n<=100)的环状DNA串(只含A,C,G,T),任务:输出改环状串的最小表示。
- 字典序:字符串在字典中的顺序,对于两个字符串,
- 第一个位置开始比较,某个位置字符不同时,字符较小的串,字典序较小
- 较短的字符串的字典序小(hi<history)
-
#include<stdio.h> #include<string.h> #define maxn 105 //判断p是否比q的字典序小 int less(const char*s,int p,int q) { int n=strlen(s); for(int i=0;i<n;i++) { if(s[(p+i)%n]!=s[(q+i)%n]) //如果遇到字符不同,就进行判断; { //注意,循环的可以用"...%n"来进行循环。 return (s[(p+i)%n<s[(q+i)%n]]); //如果p<q,就返回1,其他情况返回0; } } return 0; } int main() { int T; char s[maxn]; scanf("%d",&T); while(T--) { scanf("%s",s); int ans=0; int n=strlen(s); for(int j=0;j<n;j++) { if(less(s,j,ans)) //不断判断更新ans的值 ans=j; } for(int i=0;i<n;i++) { putchar(s[(i+ans)%n]); //用putchar一个个输出字符 } putchar(' '); } return 0; }
- 注意有putchar(),和用"%n"来循环