Training 1:整数算法训练(答案本博客其他篇内容有详解)
1. 题目:通过编程实现,统计1~n有多少个9
提示:n通过参数传入
2. 题目:有n个人围成一圈,顺序排号,从第一个开始报数(从1到3报数),凡报到3的人退出圈子,问最后最后留下的是原来第几号的那位.
提示:用数组完成
#include<stdio.h>
main()
{
int a[
100];
int i,n,p=
0,q;
printf(
"input number:");
scanf(
"%d",&n);
q=n;
for(i=
0;i<n;i++) a[i]=i+
1;
for(i=
0;;i++)
{
if(i==n) i=
0;
//当i++一直到n时,肯定有一些没有被选到,比如我们输入8,第一轮是3,6被赋值0,当i=8时,继续下一轮//
if(a[i]!=
0) p++;
//我们下面定义的是当循环到三时,就赋值0,所以这边等0的不考虑在内//
else continue;
if(p%
3==
0)
//这个就是从0一直加,到三的倍数就赋值为0,从而就达到我们的目的//
{a[i]=
0;q--;}
//上面q=n;表明q==n,只有一个为0就减一,为下面做铺垫//
if(q==
1)
break;
//当剩下最后一个就输出//
}
for(i=
0;i<n;i++)
if(a[i]!=
0)
printf(
"spare: %d\n\n",a[i]);
}
3. 题目:输入5个数(含负数、小数)将它们按由小到大的顺序排列起来
提示:需要排数的数字通过参数传递进来,
例如:输入:./a.out -1 2.1 -3 5 7 输出: -3 -1 2.1 5 7
4. 题目:求100以内的素数,全部打印出来
5. 题目: 一个数如果恰好等于它的因子之和,这个数被成为”完数”,例如:6=1+2+3.请编程找出1000以内的完数
Training2:位操作训练
1. 题目:请编写一个c函数,该函数给出一个字节中被置为1的位的个数
2. 题目:输入一个整数a,再输入两个整数p1,p2(p1,p2<32),输出该整数的二进制表示方法中从右端开始的p1到p2位.
3. 题目:输入一个整数a,再输入两个整数p1,p2(p1,p2<32),将该整数的二进制表示方法中从右端开始的p1到p2位取反后输出
4. 题目:输入一个整数a,再输入两个整数p(p<32),v(0|1),将该整数a的p位设置为v,输出修改后的该整数的二进制表示.
5. 题目:输入一个32位的整数a,使用按位异或^运算,生成一个新的32位整数b,使得该整数b的每一位等于原整数a中该位左右两边两个bit位的异或结果
提示:0 ^ 0 = 0; 1^ 1 = 0; 0 ^ 1 = 1; 1 ^ 0 = 1;
Training3:递归和栈编程训练
1. 题目: 利用递归方法实现一个函数,该函数能够实现n的阶乘,即 n! = n*(n-1)*…*3*2*1;
2. 题目:利用字符数组实现一个先入后出的栈结构,并提供栈操作的push和pop的接口
3. 题目:输入一个表达式字符串,如1+3*4-6,输出这个表达式的值.
提示:需要建立两个栈结构,一个为整形存放操作数,另一个为字符型,存放运算符,运算符的进栈要和在站顶的元素比较优选级如果低于栈顶元素则进行一次运算,要求至少实现正整数的加减乘除四则运算,如100- 5*4 -50/10 =75
4. 题目:利用递归函数调用方式,将所输入的n个字符以相反顺序打印出来
Training4:字符串训练
1. 题目: 请编写一个C函数,该函数将一个字符串逆序
2. 题目: 请编写一个C函数,该函数可以实现将一个整数转为任意进制的字符串输出
3. 题目: 输入一个字符串,计算字符串中子串出现的次数
4. 题目: 编写一个C函数,将”I am from shanghai ”倒置为”shanghaifrom am I”,及将句子中的单词位置倒置,而不改变单词内部结构.
5. 题目: 输入一个字符串,同时输入帧头和帧尾(可以是多个字符),将该字符串中合法的帧识别出来.
提示:帧头和帧尾分别是head和tail 字符串”asdheadhauboisoktail”中headhauboisoktail是合法帧
Training5:指针和链表训练
1. 题目:有n个人围成一圈,顺序排号,从第一个开始报数(从1到3报数),凡报到3的人退出圈子,问最后最后留下的是原来第几号的那位.
提示:用环形链表实现
2. 题目:创建两个学生链表,含有姓名、年龄的信息,一个链表存放男生,一个链表存放女生
3. 题目:将上面两个链表合并,按学生的年龄进行排序,合成新的链表
4. 题目:将上题中建立的链表进行反转,实现按年龄的逆序排列
5. 题目:在上面的实现的新链表中,给定一个年龄,迅速查找和该学生年龄最接近的学生姓名
提示:使用双向链表
6. 题目:利用链表实现一个先入后出的栈结构,并提供栈操作的push和pop的接口