开始学c 第三天

时间:2022-12-08 20:52:21

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;