XDOJ-电子大类-Ex6-数组和字符串——MZH

文章主要介绍了7个C语言编程实例,涉及单词计数、选择排序、删除重复字符、字符串排序、身份证验证、十六进制转换、IP地址解析、英文单词排序、说反话算法、数字分析等,展示了基础的编程技术和算法应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

7-1 统计一行文本的单词个数

#include<stdio.h>
#include<string.h>
int main()
{
    char s[1001];
    gets(s);
    int pos=0;
    for(register int i=0;i<strlen(s);i++)
    {
        if(s[i]!=' ')
        {
            pos=1;
        }
    }
    if(pos==0)//如果全是空格
    {
        printf("0");
        return 0;
    }
    int ans=1,flag=1;//flag是为了排除连续空格情况
    for(register int i=0;i<strlen(s);i++)
    {
        if(s[i]==' '&&flag==0)
        {
            ans++;
            flag=1;
        }
        else//可删去
        {
            if(s[i]!=' '&&flag==1)
            {
                flag=0;
            }
        }
    }
    if(flag==1)//特判如果是以空格结尾
    {
        ans--;
    }
    printf("%d",ans);
    return 0;
}

7-2 选择法排序

#include<stdio.h>
int main()
{
    int n,a[1001];
    scanf("%d",&n);
    for(register int i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
    }
    for(register int i=1;i<=n;i++)
    {
        int maxn=-100000,pos;
        for(register int j=i;j<=n;j++)//找到剩余项中的最大项
        {
            if(a[j]>maxn)
            {
                maxn=a[j];
                pos=j;//记录下标
            }
        }
        int t;//通过数组元素互换将最大项插入数组中
        t=a[i];
        a[i]=maxn;
        a[pos]=t;
    }
    for(register int i=1;i<n;i++)
    {
        printf("%d ",a[i]);
    }
    printf("%d",a[n]);
    return 0;
}

7-4 删除重复字符

#include<stdio.h>
#include<string.h>
int main()
{
    char s[1001];
    int a[1001]={0},maxn=0;
    gets(s);
    for(register int i=0;i<=strlen(s);i++)
    {
        a[(s[i]-0)]++;//记录字符出现的次数
        if((s[i]-0)>maxn)
        {
            maxn=s[i]-0;//记录范围方便下一个循环
        }
    }
    for(register int i=1;i<=maxn;i++)
    {
        //printf("%d\n",a[i]);
        if(a[i]!=0)//只要出现都只输出一次
        {
            printf("%c",i);//强制类型转换,i是ASCLL码
        }
    }
    return 0;
}

7-5 字符串的冒泡排序

#include<stdio.h>
#include<string.h>
int main()
{
    int n,k;
    char s[1001][1001];
    scanf("%d %d",&n,&k);
    getchar();
    for(register int i=1;i<=n;i++)
    {
        gets(s[i]);
    }
    for(register int i=1;i<=k;i++)//只进行k轮
    {
        for(register int j=1;j<=(n-i);j++)
        {
            if(strcmp(s[j],s[j+1])>0)//字符串比较函数
            {
                char ss[1001];//交换两个字符串
                strcpy(ss,s[j]);
                strcpy(s[j],s[j+1]);
                strcpy(s[j+1],ss);
            }
        }
    }
    for(register int i=1;i<=n;i++)
    {
        puts(s[i]);
    }
    return 0;
}

7-6 字符串排序

#include<stdio.h>
#include<string.h>
int main()
{
    char s[1001][1001];
    for(register int i=1;i<=5;i++)
    {
        scanf("%s",s[i]);
    }
    for(register int i=1;i<=5;i++)//字符串的冒泡排序
    {
        for(register int j=1;j<=(5-i);j++)
        {
            if(strcmp(s[j],s[j+1])>0)//字符串的比较函数
            {
                char ss[1001];//利用复制函数交换两个字符串
                strcpy(ss,s[j]);
                strcpy(s[j],s[j+1]);
                strcpy(s[j+1],ss);
            }
        }
    }
    printf("After sorted:\n");
    for(register int i=1;i<=5;i++)
    {
        printf("%s\n",s[i]);
    }
    return 0;
}

7-7 统计字符出现次数

#include<stdio.h>
#include<string.h>
int main()
{
    char s[1001],c;
    int ans=0;
    gets(s);
    scanf("%c",&c);
    for(register int i=0;i<strlen(s);i++)//遍历
    {
        if(s[i]==c)//出现题目给定字符
        {
            ans++;
            //printf("%d    ",i);
        }
    }
    printf("%d",ans);
    return 0;
}

7-8 查验身份证

#include<stdio.h>
#include<string.h>
struct ss
{
    char s[1001];
    int pos;
}a[1001];
int main()
{
    int n,b[17]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
    char c[11]={'1','0','X','9','8','7','6','5','4','3','2'};
    scanf("%d",&n);
    getchar();
    for(register int i=1;i<=n;i++)
    {
        gets(a[i].s);
        a[i].pos=1;//初始化,此时代表正确
        int num=0;//就是题目中所说的z值
        for(register int j=0;j<=16;j++)
        {
            if(a[i].s[j]<'0'||a[i].s[j]>'9')
            {
                a[i].pos=0;//前十七位中出现了非数字元素
                break;
            }
            num+=(a[i].s[j]-'0')*b[j];
        }
        num=num%11;
        //printf("%d\n",num);
        if(c[num]!=a[i].s[17]&&a[i].pos==1)//当前十七位均为数字时,比较校验码和最后一位的值
        {
            a[i].pos=0;
        }
    }
    int flag=1;//判断是否有错误的值
    for(register int i=1;i<=n;i++)
    {
        if(a[i].pos==0)
        {
            printf("%s\n",a[i].s);
            flag=0;
        }
    }
    if(flag==1)//全部正确
    {
        printf("All passed");
    }
    return 0;
}

7-9 十六进制字符串转换成十进制非负整数

#include<stdio.h>
#include<string.h>
#include<math.h>
int main()
{
    char s[1001];
    gets(s);
    int num=0;
    long int ans=0;
    for(register int i=0;i<strlen(s);i++)
    {
        if(s[i]<'0'||s[i]>'9'&&s[i]<'A'||s[i]>'F'&&s[i]<'a'||s[i]>'f')
        //判断除可能出现在十六进制中的数以外的值是否有出现
        {
            /*for(register int j=i;j<strlen(s);j++)
            {
                s[j]=s[j+1];
            }*/移动覆盖或许太过耗费时间
            s[i]='K';//进行标记
        }
        else
        {
            num++;//记录合法字符数,即位数
        }
    }
    //printf("%d",num);
    for(register int i=0;i<strlen(s);i++)
    {
        if(s[i]!='K')
        {
            printf("%c",s[i]);
           //十六进制转化规则
           if(s[i]>='0'&&s[i]<='9')
            {
               ans+=(s[i]-'0')*pow(16,num-1);
            }
            if(s[i]>='A'&&s[i]<='F')
            {
                ans+=(s[i]-'A'+10)*pow(16,num-1);
             }
            if(s[i]>='a'&&s[i]<='f')
            {
                ans+=(s[i]-'a'+10)*pow(16,num-1);
             }
            num--;
        }
    }
    printf("\n%ld",ans);
    return 0;
}

7-10 IP地址转换

#include<stdio.h>
#include<string.h>
int main()
{
    char s[1001];
    gets(s);
    int num=1;
    for(register int i=1;i<=4;i++)//8个一组一共共有四组
    {
        int a=0;
        while(num%8!=0)
        {
            a=a+pow(2,8-num%8)*(s[num-1]-'0');//二进制转化规则
            num++;
        }
        //printf("%d",num);
        a+=(s[num-1]-'0');//最后一位没有加上就已经跳出循环了
        num++;//如果不加一,则不会再进入上方循环
        if(i!=4)//为了符合格式
        {
            printf("%d.",a);
        }
        else
        {
            printf("%d",a);
        }
    }
    return 0;
}

7-11 英文单词排序

#include<stdio.h>
int main()
{
    char s[1001][101];
    int num=0;
    scanf("%s",s[num]);
    while(s[num][0]!='#')
    {
        num++;
        scanf("%s",s[num]);
    }
    num--;//直接去掉最后的‘#’,防止对单个字符产生干扰
    //printf("%s",s[num]);
    for(register int i=0;i<=num;i++)//字符串冒泡排序
    {
        for(register int j=0;j<(num-i);j++)
        {
            if(strlen(s[j])>strlen(s[j+1]))
            {
                char ss[1001];
                strcpy(ss,s[j]);
                strcpy(s[j],s[j+1]);
                strcpy(s[j+1],ss);
            }
        }
    }
    for(register int i=0;i<=num;i++)
    {
        printf("%s ",s[i]);
    }
    //printf("%s",s[num]);
    return 0;
}

7-12 说反话-加强版

我的方法有问题,需要优化,但我懒得去做,正确代码:说反话-加强版

 7-13 到底有多二

#include<stdio.h>
#include<string.h>
int main()
{
    char s[101];
    gets(s);
    int flag1=0,flag2=0,num=0,len=strlen(s);
    double k=0;
    if((s[strlen(s)-1]-'0')%2==0)//判断是否为偶数
    {
        flag2=1;
    }
    /*if(strlen(s)==1&&flag2==1)
    {
        printf("200.00");
        char c='%';
        printf("%c",c);
        return 0;
    }*/
    if(s[0]=='-')//判断是否为素数
        {
            flag1=1;
            len--;//需要除去‘-’才为位数
        }
    for(register int i=0;i<=strlen(s);i++)
    {
        if(s[i]=='2')
        {
            num++;//统计2的个数
        }
    }
    if(flag1==0&&flag2==0)//非偶非负
    {
        k=1.0*num/len*100;
        printf("%.2lf",k);
    }
    if(flag1==1&&flag2==0)//只是负数
    {
        k=1.0*num/len*100*1.5;
        printf("%.2lf",k);
    }
    if(flag1==0&&flag2==1)//只是偶数
    {
         k=1.0*num/len*100*2.0;
        printf("%.2lf",k);
    }
    if(flag1==1&&flag2==1)//负的偶数
    {
        k=1.0*num/len*100*1.5*2.0;
        printf("%.2lf",k);//printf("%.2lf%%",k);
    }
    char c='%';//处理百分号,也可以按照上一行的那样写
    printf("%c",c);
    return 0;
}

7-14 猜数字

#include<stdio.h>
#include<string.h>
#include<math.h>
struct ss
{
    char s[1001];//名字
    int num;//所猜的数
}a[10001];
int main()
{
    int n,arr=0,ans=0,min=100001;
    scanf("%d",&n);
    for(register int i=1;i<=n;i++)
    {
        scanf("%s %d",a[i].s,&a[i].num);
        arr+=a[i].num;//先计算总数
    }
    arr=arr/n/2;//计算平均数的一半
    for(register int i=1;i<=n;i++)
    {
        if(fabs(a[i].num-arr)<min)//寻找最接近的数
        {
            min=fabs(a[i].num-arr);
            ans=i;//记录位置
        }
    }
    printf("%d %s",arr,a[ans].s);
    return 0;
}

7-15 敲笨钟

同样,我的代码没过。。。但思路是正确的!!!

正确代码:L1-059 敲笨钟 (20 分) C语言 

7-16 输出GPLT

#include<stdio.h>
#include<string.h>
int main()
{
    char s[10001];
    int g=0,p=0,l=0,t=0,min=100001;
    gets(s);
    for(register int i=0;i<=strlen(s);i++)//统计个数
    {
        if(s[i]=='g'||s[i]=='G')
        {
            g++;
        }
        if(s[i]=='p'||s[i]=='P')
        {
            p++;
        }
        if(s[i]=='l'||s[i]=='L')
        {
            l++;
        }
        if(s[i]=='t'||s[i]=='T')
        {
            t++;
        }
    }
    while(g!=0||p!=0||l!=0||t!=0)//只要有一种字母还有剩下的就输出
    {
        if(g>0)
        {
            printf("G");
            g--;
        }
        if(p>0)
        {
            printf("P");
            p--;
        }
        if(l>0)
        {
            printf("L");
            l--;
        }
        if(t>0)
        {
            printf("T");
            t--;
        }
    }
    return 0;
}

7-17 出租

#include<stdio.h>
#include<string.h>
int main()
{
    char s[1001];
    gets(s);
    int flag[11]={0},a[11],num=0,place[1001];
    for(register int i=0;i<strlen(s);i++)
    {
        flag[s[i]-'0']++;//记录有哪些数字
    }
    for(register int i=9;i>=0;i--)
    {
        if(flag[i]!=0)
        {
            a[num]=i;//将存在会用到的数字存储在一个数组中
            num++;
        }
    }
    for(register int i=0;i<strlen(s);i++)
    {
        for(register int j=0;j<num;j++)
        {
            if((s[i]-'0')==a[j])
            {
                place[i]=j;//记录数组下标,即位置
            }
        }
    }
    printf("int[] arr = new int[]{");
    for(register int j=0;j<num;j++)
    {
        if(j==(num-1))
        {
            printf("%d};",a[j]);
            break;
        }
        printf("%d,",a[j]);//为了符合格式
    }
    printf("\nint[] index = new int[]{");
    for(register int i=0;i<strlen(s);i++)
    {
        if(i==strlen(s)-1)
        {
            printf("%d};",place[i]);
            break;
        }
        printf("%d,",place[i]);//为了符合格式
    }
    return 0;
}

7-18 找最长的字符串

#include<stdio.h>
#include<string.h>
int main()
{
    int n,maxn=0;
    char a[1001];
    scanf("%d",&n);
    for(register int i=1;i<=n;i++)
    {
        char s[1001];
        gets(s);
        if(strlen(s)>maxn)//比较最大长度
        {
            maxn=strlen(s);
            strcpy(a,s);//使用复制函数记录最长字符串
        }
    }
    printf("The longest is: %s",a);
    return 0;
}

7-19 A-B

#include<stdio.h>
#include<string.h>
int main()
{
    char s[10001],a[10001];
    int b[10001]={0},c[500]={0};
    gets(s);
    gets(a);
    for(register int i=0;i<strlen(a);i++)
    {
        if(c[a[i]-'0']==1)//优化,通过标记避免重复情况
        {
            continue;
        }
        c[a[i]-'0']=1;//标记已经删除过的量
        for(register int j=0;j<strlen(s);j++)
        {
            if(b[j]==1)//没啥用的优化。。。
            {
                continue;
            }
            if(s[j]==a[i])
            {
                b[j]=1;//标记相当于删除
            }
        }
    }
    for(register int i=0;i<=strlen(s);i++)
    {
        if(b[i]==0)//未被标记的输出
        {
            printf("%c",s[i]);
        }
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值