1 统计字符串中a-z出现的次数
问题:1 ascii码:1-》49;a-》97;A-》65;
2 用p[26]保存各个字母的出现次数,初始化为全0;
3 遍历字符串,判断96<c<123是否成立,成立则p[c-97]++;
# include <stdio.h> # include <string.h> void cou(char *s,int *p) { int i,num=0,len=strlen(s); for(i=0;i<len;i++) { num=s[i]; if(96<num<123) p[num-97]++; } } void main() { char ss[50]; scanf("%s",ss); printf("\n"); int i,p[26]; for(i=0;i<26;i++) { p[i]=0; } cou(ss,p); printf("a-z:\n"); for(i=0;i<26;i++) { printf("%d ",p[i]); } }
2 将数字字符串转换为数字
问题:1 pow(10,n),求10的n次方
2 遍历字符串,将字符的ascii码减去48得到数值,根据下标i计算n=len-1-i,得到数;
# include <stdio.h> # include <math.h> # include <string.h> int cou(char *s) { int c=10,sum=0,num,i,j,len=strlen(s); for(i=0;i<len;i++) { num=s[i]; sum=sum+pow(10,len-i-1)*(num-48); } return sum; } void main() { int re; char ss[50]; scanf("%s",ss); printf("\n"); re=cou(ss); printf("the result is:%d",re); }
3 求两个字符串的最大公共字符串
问题 1 依次遍历第一个字符串,对其中的每一个字符,去第二个字符串中寻找相同的字符,若找到,则保存字符到临时字符串中,继续向后比较,直到不匹配为止。得到相同的子串长度,与原先求得的长度比较,若大于原先长度,则临时字符串代替原先的结果字符串,并令子串长度为0,继续遍历第一个字符串。若小于或等于原长度,则初始化临时变量,继续遍历;
问题2 错误:用strchr函数获取第二个字符串中的匹配字符,如果不存在,则会出现空指针错误;
问题3 错误:得到最大字符串之后,应当置字符串末尾为'\0'
问题4 更好的算法:看到一位网友的算法,觉得更好,将两个字符串存入二维数组中,然后找出最大的斜线即是最大子字符串
#include <stdio.h> #include <stdlib.h> #include <string.h> void find(char *p,char *q,char *r) { int i,j,l1,l2,k=0,te=0,i1,j1,w=0; char s[50],ss[]={""}; l1=strlen(p); l2=strlen(q); char *t; t=NULL; for(i=0;i<l1;i++) { for(j=0;j<l2;j++) { if(*(p+i)==*(q+j)) { t=q+j; i1=i; while(*t==*(p+i1)) { s[k++]=*(t++); i1++; } if(k>w) { w=k; for(j=0;j<w;j++) { *(r+j)=s[j]; } *(r+w)='\0'; } strcpy(s,ss); k=0; break; } } } } void main() { char s1[50],s2[50],s3[50]; printf("please insert the string:"); scanf("%s",s1); scanf("%s",s2); find(s1,s2,s3); printf("\n%s %d",s3,strlen(s3)); }
4 半张象棋上,马的位置在(1,1),且只能往右走,上下皆可,若终点为(m,n),求出所有的走法
问题:1 递归算法,从倒数第二点到(m,n)有4种可能,依次递归即可;代码莫名其妙的不见了。。
2 条件:A 若(x,y)==(m,n)return 1;B 若x>m或x==m&&y>n return 0;