《算法分析与设计》练习4

目录

A 字符识别

B 数的划分

C 幸运人士

D 线性搜索

E 二分搜索(递归)

F 二分搜索(非递归)


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的整数划分有  : 6
                                    5  1
                                    4  2
                                    4  1   1
                                    3  3 
                                    3  2   1
                                    3  1   1  1
                                    2  2   2
                                    2  2   1  1
                                    2  1   1  1   1
                                    1  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 个人   最后 幸运人在  1
                       1 2                          幸运人在  2
                       1 2 3                        幸运人在  2
                       1 2 3 4                     幸运人 在  4
                       1 2 3 4 5                             在  4
                       1 2 3 4 5 6                               4
                       1 2 3 4 5 6 7                             4
                       1 2 3 4 5 6 7 8                          8
                       1 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;


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值