目录
A 字符识别
题目描述
你的任务是写一个程序进行字符识别。别担心,你只需要识别1, 2, 3,如下:
.*. *** ***
.*. ..* ..*
.*. *** ***
.*. *.. ..*
.*. *** ***
输入
输入仅包含一组数据,由6行组成。第一行为字符的个数n(1<=n<=10)。以下5行每行包含4n个字符。每个字符恰好占5行3列,然后是一个空列(用"."填充)。
输出
输出应包含一行,即识别出的各个字符。
样例输入 Copy
3
.*..***.***.
.*....*...*.
.*..***.***.
.*..*.....*.
.*..***.***.
样例输出 Copy
123
分析:查图可以得出两种条件数字的第一行第一个字符 如果为 ‘ . ’那么一定是 1否则 就看 第四行 的第一个字符 如果 为 ‘ . ’则是3否则 就是 2
代码实现:c语言#include <stdio.h> #include <stdlib.h> char a[200][200]; int main (){ int n; while(~scanf("%d",&n)){ for(int i=0;i<5;i++) scanf("%s",a[i]); solve(n); printf("\n"); } return 0; } void solve (int n){ for(int j=0;j<n*4;j++) { if((j+1)%4==1) { if(a[0][j]=='.') printf("1"); else{ if(a[3][j]=='.') printf("3"); else printf("2"); } } } }
B 数的划分
题目描述
使用递归编写一个程序,求一个正整数n的所有划分个数。
例如,输入3,输出3;输入4,输出5。
输入
多组输入,每一组是一个正整数n。
输出
输出划分数。
样例输入 Copy
3
4
样例输出 Copy
3
5
分析:这也算一个比较正规的算法题了直接举例分析:假如这个数是 6对于 6的整数划分有 : 65 14 24 1 13 33 2 13 1 1 12 2 22 2 1 12 1 1 1 11 1 1 1 1 1 1共11种对其归纳得:假设我们对n 这个正整数进行 m的划分 ,意思就是 把n这个正整数 分成 不超过m 的加数 得到 把它的次数 设为 p(n,m);所以 有 if n==1 | | m==1 那么 p(n,m)=1;if n==m 那么 p(n,m)=p(n,m-1)+1;if n<m 那么 p(n,m)=p(n,n);if n>m 那么 p(n,m)=p(n,m-1)+p(n-m,m)(注意 这个表达式可以 看 除了第1列 的 其他列理解记忆)
代码实现:c语言#include <stdio.h> #include <stdlib.h> int main (){ int n; while(~scanf("%d",&n)){ int z=p(n,n); printf("%d",z); printf("\n"); } return 0; } int p(int n,int m){ if(n==1||m==1) return 1; if(n==m) return p(n,m-1)+1; if(n<m) return p(n,n); if(n>m) return p(n,m-1)+p(n-m,m); }
C 幸运人士
题目描述
一次大型派对的最后节目是选出一位幸运人士,该人士将获得派对组织者准备的一个钻石戒指。
而选择幸运人士的办法是让所有人员一字排列,然后从左至右点数,凡是奇数号的全部剔除。
对于剩下的人员,又从左至右点数,逢奇数号就剔除。
如此不断递归下去,直到只剩下一个人为止,此人即为幸运之人。
请设计一个递归算法计算幸运之人所在的位置。
输入
多组数据,每组输入一个正整数n。
输出
输出最后剩下的那个人的位置。
样例输入 Copy
1
2
3
样例输出 Copy
1
2
2
分析:凡是这种题,我们一般先都是找规律举例就是很好的方法:假如有 编号为 1 这 1 个人 最后 幸运人在 11 2 幸运人在 21 2 3 幸运人在 21 2 3 4 幸运人 在 41 2 3 4 5 在 41 2 3 4 5 6 41 2 3 4 5 6 7 41 2 3 4 5 6 7 8 81 2 3 4 5 6 7 8 9 8......不难发现规律 即为 log 2 ,然后作为2的幂具体看代码:
代码实现:c语言#include <stdio.h> #include <stdlib.h> int main (){ int n; while(~scanf("%d",&n)){ int z=digui (n); printf("%d",z); printf("\n"); } return 0; } int digui (int n){ if(n>0) { if(n==1) return 1; return digui(n/2)*2; } }
D 线性搜索
题目描述
请编写一个程序,输入包含n(n<=10000)个整数的数列S以及包含q个(q<=500)不重复整数的数列T,输出既包含于T也包含于S的整数的个数C。S、T中的元素均大于0且小于109,T的元素不重复。
输入
多组输入。
每一组输入的第一行输入n,第二行输入代表S的n个整数,第三行输入q,第四行输入代表T的q个整数。
输出
用1行输出C。
样例输入 Copy
5
1 2 3 4 5
3
3 4 1
样例输出 Copy
3
分析:这个题,题目已经明了了,就是暴力线性搜索,嘿嘿嘿请直接手写代码
代码实现:c语言#include <stdio.h> #include <stdlib.h> int main (){ int al; int bl; while(~scanf("%d",&al)) { int a[al]; for(int i=0;i<al;i++) scanf("%d",&a[i]); scanf("%d",&bl); int b[bl]; for(int i=0;i<bl;i++) scanf("%d",&b[i]); int z=solve(a,b,al,bl); printf("%d",z); printf("\n"); } return 0; } int solve (int a[],int b[],int al,int bl){ int count=0; for(int i=0;i<al;i++) for(int j=0;j<bl;j++) { if(a[i]==b[j]) count++; } return count; }
E 二分搜索(递归)
题目描述
使用递归算法,实现二分搜索。
输入
多组数据输入,每组第一个数字为数组的长度n,然后输入n个整数,最后输入待查询的值。
输出
输出待查询值所在的位置,如果没有找到,则返回-1。
样例输入 Copy
3 1 2 3 2
4 0 1 3 4 2
样例输出 Copy
2
-1
分析:这个二分搜索肯定是有序滴,所以搜索无非就是定一个low位 hign位 然后求mid位 是否与 关键字相同即可具体请看无编译记事本 代码直接实现,嘿嘿嘿
代码实现:c语言#include <stdio.h> #include <stdlib.h> int main (){ int n; int key; int a[200]; while(~scanf("%d",&n)){ for(int i=0;i<n;i++) scanf("%d",&a[i]); scanf("%d",&key); int z=solve(a,0,n-1,key); printf("%d",z); printf("\n"); } return 0; } int solve (int a[],int low ,int high,int key){ if(low <= high){ int mid=(low+high)/2; if(a[mid]==key) return mid+1; else{ if(key<a[mid]) return solve(a,low,mid-1,key); if(key>a[mid]) return solve(a,mid+1,high,key); } } else return -1; }
F 二分搜索(非递归)
题目描述
使用非递归算法,实现二分搜索。
输入
多组数据输入,每组第一个数字为数组的长度n,然后输入n个整数,最后输入待查询的值。
输出
输出待查询值所在的位置,如果没有找到,则返回-1。
样例输入 Copy
3 1 2 3 2
4 0 1 3 4 2
样例输出 Copy
2
-1
分析:同上题一样,就不多作解释了,只不过是用循环来做请直接看我记事本手写代码表演
代码分析:c语言#include <stdio.h> #include <stdlib.h> int main (){ int a[2000]; int key; int n; while(~scanf("%d",&n)){ for(int i=0;i<n;i++) scanf("%d",&a[i]); scanf("%d",&key); int z=solve(a,0,n-1,key); printf("%d",z); printf("\n"); } return 0; } int solve (int a[],int low,int high,int key){ while(low<=high){ int mid =(low+high)/2; if(a[mid]==key) return mid+1; else{ if(key<a[mid]) high=mid-1; else low=mid+1; } } return -1; }