智能车任务三

1、无重复字符的最长字串

给定一个字符串,找出不含有重复字符的最长子串的长度。

要求:

1、给定字符串最大长度 100,不包含空格等特殊字符;

2、测试输入多组数据,以读取到文件结尾为结束。 输入示例:

输入示例:

abcabcbb
bbbbb
pwwkew

输出示例:

3
1
3

#include <stdio.h>

int main()
{
    char s[110];
    int a[200];
    char *p, *q;
    int ans, maxans;
    while (scanf("%s",s) != EOF)
    {
        for (p = s; *p != '\0'; p++)
            a[*p] = 0;
        maxans = ans = 0;
        for (p = s; *p != '\0'; p++)
        {
            if (a[*p] == 0)
            {
                a[*p] = 1;
                ans ++;
            }
            else
            {
                if (ans > maxans)
                    maxans = ans;
                ans = 1;
                for (q = s; *q != '\0'; q++)
                    a[*q] = 0;
                a[*p] = 1;
            }
        }
        for (p = s; *p != '\0'; p++)
            a[*p] = 0;
        printf("%d\n",maxans);
    }
    return 0;
}

 

 

 

2、数组中两个数的最大异或值 输入一串不重复的正整型数字,个数不超过 233 个,ai 和 aj

分别为其中不相同的两个数字,找到 ai 和 aj 最大的异或(XOR)运 算结果,其中 0≤i,j<n。

要求:

1、每组输入数据第一个值为该组数据中数字的个数;

2、测试输入多组数据,以读取到文件结尾为结束。

 

输入示例:

6 3 10 5 25 2 8
10 2 324 53 213 54 213 534 23 34 375
20 45 56 67 78 89 899 675 32 31 42 53 64 35 47 8 32 13 53 34 21

输出示例:

28 865 986
 
#include <stdio.h>

int a[250];

int main()
{
    int n, i, j, x, ans;
    while (scanf("%d",&n) != EOF)
    {
        ans = 0;
        for(i = 0; i < n; i++)
            scanf("%d",&a[i]);
        for (i = 0; i < n; i++)
            for (j = 0; j < n; j++)
            {
                x = a[i]^a[j];
                if (x > ans)
                    ans = x;
            }
        printf("%d\n",ans);
    }
    return 0;
}

 

3、单链表初试

已知一个正整数组成的无序序列,个数未知,但至少有一个元素,你的任务是建立一个单链表,并使用该链表存储这个正整数 序列,然后将这个链表进行排序,使得排序后的链表为递增序列。

每组数据的输入以-1 作为结束标志,注意-1 不算这个正整数序列 中的元素。结束后输出排序后的正整数序列,以空格间隔(要求 使用链表,会抽查代码)

要求:

1、测试输入多组数据,以读取到文件结尾为结束。

2、输出序列在大括号内部以, 间隔

输入示例:

5 4 3 2 4 7 5 3 4 5 -1
99 77 55 33 11 22 44 66 88 -1

输出示例:

{2, 3, 3, 4, 4, 4, 5, 5, 5, 7}
{11, 22, 33, 44, 55, 66, 77, 88, 99}

#include <stdio.h>
#include <stdlib.h>

struct a
{
    int data;
    struct a *next;
};


int main()
{
    struct a *pnew, *head, *ptail, *i, *j, *k;
    pnew = (struct a*) malloc(sizeof(struct a));
    while(scanf("%d",&pnew->data) != EOF)
    {
        head = ptail = pnew;
        while (1)
        {
            pnew = (struct a*) malloc(sizeof(struct a));
            scanf("%d",&pnew->data);
            if (pnew->data == -1)
            {
                ptail->next = NULL;
                break;
            }
            ptail->next = pnew;
            ptail = pnew;
        }
        for (i = head; i->next != NULL; i = i->next)
        {
            k = i;
            for (j = i->next; j != NULL; j = j->next)
                if (j->data < k->data)
                    k = j;
            int x = k->data;
            k->data = i->data;
            i->data = x;
        }
        printf("{%d",head->data);
        for (i = head->next; i != NULL; i = i->next)
            printf(", %d",i->data);
        printf("}\n");
    }
    return 0;
}

 

4、结构体练习 学生信息的显示,具体要求如下:

定义一个结构体描述学生信息(学号,姓名,年龄);

设计一个函数,用于显示单个学生信息,函数的参数为前面定义的结构体类型,输出格式为:{学号, 姓名, 年龄} 设计一个主函数,在主函数中输入学生的信息,并调用前面定义的函数进行显示。

要求:

1、每组数据输入和输出占据多行;

2、输入第一行为输入学生的数量 N(不超过 10 个),随后为 N 行学生信息,格式为:年龄 姓名 学号;

3、输出为 N 行学生信息,格式见题目。

4、测试输入 M 组数据,M 为所有输入的第一行

 
 
#include <stdio.h>

struct student
{
    int number;
    int age;
    char name[20];
}stu[100];

void Print(struct student);

int main()
{
    int m, n, i, k, cnt = 0;
    scanf("%d",&m);
    
    for (k = 0; k < m; k++)
    {
        scanf("%d",&n);
        for (i = 0; i < n; i++)
        {
            scanf("%d%s%d",&stu[cnt].age, stu[cnt].name, &stu[cnt].number);
            cnt++;
        }
    }
    
    for (i = 0; i < cnt; i++)
        Print(stu[i]);
    //printf("\n\n\n{123, zhangsan, 21}\n{124, lisi, 22}\n{125, wangwu, 24}\n{111, baoqiang, 34}\n{112, yuxin, 23}\n{321, xiaohu, 43}");

}

void Print(struct student x)
{
    printf("{%d, %s, %d}\n",x.number, x.name, x.age);
}

 

 
 

 

5、分数之和
输入一分数序列,求出该序列之和。

要求:

1、测试涉及多组数据,数据组数在输入第一行输入;

2、每组数据包含的分数均为正数且不超过 20 个,每组 第一个数字为该组测试数据数量 N,随后跟随着 N 个分数; 3、每组输出占据一行,需计算到不可约分的分数输出。

输入示例:

2
4 2/1 3/2 5/3 8/5
5 2/3 4/2 2/1 2/3 5/4

输出示例:

203/30
79/12
#include <stdio.h>

struct number
{
    int f,c;
}num[100];

int findlcm(int, int);
int findgcd(int, int);
void Print(int, int);

int main()
{
    int n, m, i, k, lcm = 1, anss;
    scanf("%d",&m);
    for (k = 0; k < m; k++)
    {
        anss = 0;
        scanf("%d",&n);
        for (i = 0; i < n; i++)
        {
            scanf("%d/%d",&num[i].c, &num[i].f);
            lcm = findlcm(lcm,num[i].f);
        }
        for (i = 0; i < n; i++)
            anss += num[i].c * lcm/num[i].f;
        Print(anss, lcm);
    }
    return 0;
}

int findlcm(int x, int y)
{
    return x*y/findgcd(x,y);
}

int findgcd(int x, int y)
{
    if (x%y == 0)
        return y;
    if (y%x == 0)
        return x;
    if (x > y)
        return findgcd(y, x%y);
    return findgcd(x, y%x);
}

void Print(int x, int y)
{
    int t = findgcd(x,y);
    printf("%d/%d\n",x/t,y/t);
}

 




6、

简易计算器

要求:

1、测试涉及多组计算数据,以读取到文件末尾结束;

2、每组数据以不包含空格的字符串输入,每组算式不 超过 100 个字符,算式中不包含等号;

3、计算器需要支持整数运算、小数计算、加减乘除、括 号;

4、每组数据的输出为 3 位小数的形式,如果结果除不 尽要求四舍五入显示;

5、不要求高精度算法。

输入示例:

1.5+2+3*(4+0.5+0.33)/3+100
4*5*2+2.3*10/(3.1+3)*4.23*0.1

输出示例:

108.330
41.595
/*
    思路:维护两个栈,一个存运算符,一个存数字,当运算符优先级大于上一个运算符的优先级,入栈,否则弹出直到大于或栈为空。当遇到左括号时优先入栈,入栈后左括号的优先级最低。
*/
#include <stdio.h>
#include <string.h>

char ope[1000];
double dig[1000];
int fin[1000];
char s[1000];
int pri[1000]; //存储运算符优先级

int digtop, opetop;

double getdig(int i);
double pow10(int x);
void pop(void);
double oper(double, double, char);

int main()
{
    pri['*'] = pri['/'] = 2;
    pri['+'] = pri['-'] = 1;
    
    while (scanf("%s",s) != EOF)
    {
        int i = 0;
        digtop = opetop = 0;
        for (i = 0; i < strlen(s); i++)
        {
            if (fin[i] == 0) //第i位没有处理
            {
                if (s[i] >= '0' && s[i] <= '9')
                    dig[++digtop] = getdig(i);
                else
                {
                    if(s[i] == '(')
                        ope[++opetop] = '(';//如果是左括号,压入栈中
                    else
                        if(s[i] == ')')//如果是右括号,弹栈直到弹出左括号
                        {
                            do
                            {
                                pop();
                            }while (ope[opetop] != '(');
                            opetop--; //弹出左括号
                        }
                    else
                    {
                        // 当前运算符优先级小于等于前一个运算符优先级,弹出直到大于或栈为空或遇到左括号。
                        while (pri[s[i]] <= pri[ope[opetop]] && opetop>=1 && ope[opetop] != '(')
                            pop();
                        ope[++opetop] = s[i];
                    }
                    
                }
            }
        }
        while (digtop > 1)
            pop();
        printf("%.3f\n",dig[digtop]);
        for (i = 0; i < strlen(s); i++)
            fin[i] = 0;
    }
    return 0;
}

double getdig(int i) // 返回从第i位开始的数字
{
    int flag = 0;
    int ans = 0, point = 0;
    while (1)
    {
        if (s[i] == '.')
        {
            flag = 1;
            fin[i] = 1;
            i++;
        }
        else
            if (s[i] >= '0' && s[i] <= '9')
            {
                ans = ans * 10 + s[i] - '0';
                if (flag == 1)
                    point++;
                fin[i] = 1;
                i++;
            }
        else
            break;
    }
    return ans * pow10(point);
}

double pow10(int x)// 返回10的负x次方
{
    double ans = 1;
    int i;
    for (i = 0 ; i < x; i++)
        ans *= 0.1;
    return ans;
}

void pop(void)
{
    double a, b;
    char c;
    a = dig[digtop--];
    b = dig[digtop];
    c = ope[opetop--];
    dig[digtop] = oper(a,b,c);
}

double oper(double a, double b, char c)
{
    switch (c)
    {
        case '+':
            return a+b;
        case '-':
            return b-a;
        case '*':
            return a*b;
        case '/':
            return b/a;
    }
    return 0;
}

 

转载于:https://www.cnblogs.com/liumengyue/p/9973346.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值