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; }