1.WERTYU
输入一个错位后敲出的字符串,输出打字员本来想打出的字
#include<stdio.h> char *s="`1234567890-=QWERTYUIOP[]ASDFGHJKL;'ZXCVBNM,./"; int main(void) { int i,c; while((c=getchar())!=EOF) { for(i=1;s[i]&&s[i]!=c;i++); //这里用分号,搜索到字符前一个位置 if(s[i]) putchar(s[i-1]); else putchar(c); } return 0; }
2.判断一个双引号是左引号还是右引号
#include<stdio.h> int main(void) { int c,q=1; while((c=getchar())!=EOF) { if(c=='"') { printf("%s",q?"zz":"yy"); //z代表左引号,y代表右引号 q=!q; } else putchar(c); } return 0; }
3.输出一个字符串的最小周期
#include<stdio.h> #include<string.h> int main(void) { char s[100]; scanf("%s",s); int len=strlen(s); for(int i=1;i<=len;i++) //枚举所有周期 if(len%i==0) { int ok=1; for(int j=i;j<len;j++) //第二个周期的第一个字符开始比较 { if(s[j]!=s[j%i]) //如果和之前的字符不匹配,则不是一个周期 { ok=0; break; } } if(ok) { printf("%d ",i); break;//找最小的周期,就退出,如果去掉就是找所有周期 } } return 0; }
4.小学生算式,两个数相加输出多少次进位
#include<stdio.h> int main(void) { int a,b; while(scanf("%d%d",&a,&b)==2) { if(!a&&!b) return 0; int c=0,ans=0; for(int i=9;i>=1;i--) { c=(a%10+b%10+c)>9?1:0; ans+=c; a=a/10; b=b/10; } printf("%d ",ans); } return 0; }
5.阶乘的精确值
#include<stdio.h> #include<string.h> //const int maxn=1000 全局变量数组长度要求在编译时确定,const并不是真正的常量,可能会被修改,所以要声明成define #define maxn 3000 int f[maxn]; int main(void) { int i,j,n; scanf("%d",&n); memset(f,0,sizeof(f)); f[0]=1; for(i=2;i<=n;i++) { int c=0; for(j=0;j<maxn;j++) { int s=f[j]*i+c; f[j]=s%10; c=s/10; } } for(j=maxn-1;j>=0;j--) if(f[j]) break; for(i=j;i>=0;i--) printf("%d",f[i]); printf(" "); return 0; }
6.6174问题
#include<stdio.h> #include<string.h> int num[2000],count; int get_next(int x); int main(void) { scanf("%d",&num[0]); printf("%d",num[0]); count=1; for(;;) { num[count]=get_next(num[count-1]); //生成下一个输出数 printf("->%d",num[count]); //在数组num中寻找新生成的数 int found=0; for(int i=0;i<count;i++) { if(num[i]==num[count]) { found=1; break; } } //如果找到,直接退出循环 if(found) break; count++; } printf(" "); return 0; } int get_next(int x) { int a,b,n; char s[100]; sprintf(s,"%d",x); //转化成字符串 n=strlen(s); for(int i=0;i<n;i++) //冒泡排序 { for(int j=i+1;j<n;j++) if(s[i]>s[j]) { char t=s[i]; s[i]=s[j]; s[j]=t; } } sscanf(s,"%d",&b); //写入到数字b中 for(int i=0;i<n/2;i++) //字符串反转 { char t=s[i];s[i]=s[n-1-i];s[n-1-i]=t; } sscanf(s,"%d",&a); //写入数字中a return a-b; }
7.字母重排
#include<stdio.h> #include<stdlib.h> #include<string.h> int n; char word[2000][10],sorted[2000][10]; int cmp_char(const void * _a,const void *_b) { char *a=(char *)_a; char *b=(char *)_b; return *a-*b; } int cmp_string(const void * _a,const void * _b) { char *a=(char*)_a; char *b=(char*)_b; return strcmp(a,b); } int main(void) { n=0; for(;;) { scanf("%s",word[n]); if(word[n][0]=="*") break; //遇到结束终止循环 n++; } qsort(word,n,sizeof(word[0]),cmp_string); //给所有单词排序 for(int i=0;i<n;i++) { strcpy(sorted[i],word[i]); qsort(sorted[i],strlen(sorted[i]),sizeof(char),cmp_char); } //给每个单词排序 char s[10]; while(scanf("%s",s)==1) //持续读取到文件结尾 { qsort(s,strlen(s),sizeof(char),cmp_char); //给输入单词排序 int found=0; for(int i=0;i<n;i++) { if(strcmp(sorted[i],s)==0) { found=1; printf("%s",word[i]); //输出原始单词,而不是排序后的 } } if(!found) printf(":("); printf(" "); } return 0; }
8.cantor数集
#include<stdio.h> int main(void) { int n; while(scanf("%d",&n)==1) { int k=1,s=0; for(;;) { s+=k; if(s>n) { printf("%d/%d ",s-n+1,k-s+n); break; } k++; } } return 0; }
9.因子和阶乘
#include<stdio.h> #include<string.h> int is_prime(int n) { for(int i=2;i*i<=n;i++) { if(n%i==0) return 0; } return 1; } int prime[100],count=0; int main(void) { int n,p[100]; //n和各个素数的指数 for(int i=2;i<=100;i++) { if(is_prime(i)) prime[count++]=1; } while(scanf("%d",&n)==1) { printf("%d!=n",n); memset(p,0,sizeof(p)); int max=0; for(int i=1;i<=n;i++) //必须把i复制到变量m中,二不要在做除法时候修改它 { int m=i; for(int j=0;j<count;j++) while(m%prime[j]==0) { m/=prime[j]; p[j]++; if(j>max) max=j; } } for(int i=0;i<=max;i++) printf(" %d",p[i]); printf(" "); } return 0; }