hnucm-oj1166 - 2021年春季学期《算法分析与设计》练习4

hnucm-oj1166 - 2021年春季学期《算法分析与设计》练习4

A 1036: 字符识别?

题目描述
你的任务是写一个程序进行字符识别。别担心,你只需要识别1, 2, 3,如下:
.. *** ***
.
. …* …*
.. *** ***
.
. … …
.. *** ***
输入
输入仅包含一组数据,由6行组成。第一行为字符的个数n(1<=n<=10)。以下5行每行包含4n个字符。每个字符恰好占5行3列,然后是一个空列(用"."填充)。
输出
输出应包含一行,即识别出的各个字符。
样例输入 Copy
3
.
..
..
.
..
..
.
..
样例输出 Copy
123

#include <stdio.h>
#include <stdlib.h>
int main(){
    int n;
    scanf("%d",&n);
    getchar();
    int b=4*n;
    char ch[5][b];
    for(int i=0;i<5;i++){
        for(int j=0;j<b;j++){
            scanf("%c",&ch[i][j]);
        }
        getchar();
    }
    for(int i=0;i<b;i+=4){
        if(ch[3][i]=='*')
            printf("2");
        if(ch[3][i+1]=='*')
            printf("1");
        if(ch[3][i+2]=='*')
            printf("3");
    }
}

B 1407: 数的划分

题目描述
使用递归编写一个程序,求一个正整数n的所有划分个数。
例如,输入3,输出3;输入4,输出5。
输入
多组输入,每一组是一个正整数n。
输出
输出划分数。
样例输入 Copy
3
4
样例输出 Copy
3
5

#include <stdio.h>
#include <stdlib.h>
int f(int n,int m){
    if((n<1)||(m<1))
        return 0;
    if((n==1)||(m==1))
        return 1;
    if(n<m)
        return f(n,n);
    if(n==m)
        return 1+f(n,n-1);
    return f(n,m-1)+f(n-m,m);
}
int main(){
    int n,sum;
    while(scanf("%d",&n)!=EOF){
        sum=f(n,n);
        printf("%d\n",sum);
    }
}

C 1411: 幸运人士

题目描述
一次大型派对的最后节目是选出一位幸运人士,该人士将获得派对组织者准备的一个钻石戒指。
而选择幸运人士的办法是让所有人员一字排列,然后从左至右点数,凡是奇数号的全部剔除。
对于剩下的人员,又从左至右点数,逢奇数号就剔除。
如此不断递归下去,直到只剩下一个人为止,此人即为幸运之人。
请设计一个递归算法计算幸运之人所在的位置。
输入
多组数据,每组输入一个正整数n。
输出
输出最后剩下的那个人的位置。
样例输入 Copy
1
2
3
样例输出 Copy
1
2
2

#include <stdio.h>
#include <stdlib.h>
#include<math.h>
int fun(int a,double b){
    if(a<pow(2,b)){
        b=b-1.0;
        return pow(2,b);
    }
    if(a==pow(2,b))
        return pow(2,b);
    if(a>pow(2,b)){
        b=b+1.0;
        fun(a,b++);
    }
}
int main(){
    int n;
    double b=0.0;
    while(scanf("%d",&n)!=EOF){
        int m=fun(n,b);
        printf("%d\n",m);
    }
}

D 1427: 线性搜索

题目描述
请编写一个程序,输入包含n(n<=10000)个整数的数列S以及包含q个(q<=500)不重复整数的数列T,输出既包含于T也包含于S的整数的个数C。S、T中的元素均大于0且小于10^9,T的元素不重复。
输入
多组输入。
每一组输入的第一行输入n,第二行输入代表S的n个整数,第三行输入q,第四行输入代表T的q个整数。
输出
用1行输出C。
样例输入 Copy
5
1 2 3 4 5
3
3 4 1
样例输出 Copy
3

#include <stdio.h>
#include <stdlib.h>
int main(){
    long long int n,q;
    long long int s[10000],t[500];
    while(scanf("%lld",&n)!=EOF){
            int c=0;
        for(int i=0;i<n;i++)
            scanf("%lld",&s[i]);
        scanf("%lld",&q);
        for(int i=0;i<q;i++)
            scanf("%lld",&t[i]);
        for(int i=0;i<n;i++){
            for(int j=0;j<q;j++){
                if(s[i]==t[j])
                    c++;
            }
        }
        printf("%d\n",c);
    }
}

E 1418: 二分搜索(递归)

题目描述
使用递归算法,实现二分搜索。
输入
多组数据输入,每组第一个数字为数组的长度n,然后输入n个整数,最后输入待查询的值。
输出
输出待查询值所在的位置,如果没有找到,则返回-1。
样例输入 Copy
3 1 2 3 2
4 0 1 3 4 2
样例输出 Copy
2
-1

#include <stdio.h>
#include <stdlib.h>
int fun(int a[],int left,int right){
    int mid=(left+right)/2;
    while(left<=right){
        mid=(left+right)/2;
        if(a[a[0]+1]==a[mid])
            return mid;
        if(a[a[0]+1]<a[mid]){
            right=mid-1;
            fun(a,left,right);
        }
        else{
             left=mid+1;
             fun(a,left,right);
        }
    }
    return -1;
}
int main(){
    int n[100],m;
    while(scanf("%d",&n[0])!=EOF){
        int left=1,right=n[0];
        for(int i=1;i<=(n[0]+1);i++)
            scanf("%d",&n[i]);
        m=fun(n,left,right);
        printf("%d\n",m);
    }
}

F 1419: 二分搜索(非递归)

题目描述
使用非递归算法,实现二分搜索。
输入
多组数据输入,每组第一个数字为数组的长度n,然后输入n个整数,最后输入待查询的值。
输出
输出待查询值所在的位置,如果没有找到,则返回-1。
样例输入 Copy
3 1 2 3 2
4 0 1 3 4 2
样例输出 Copy
2
-1

#include <stdio.h>
#include <stdlib.h>
int main(){
    int n[100],m;
    while(scanf("%d",&n[0])!=EOF){
        int left=1,right=n[0];
        for(int i=1;i<=(n[0]+1);i++)
            scanf("%d",&n[i]);
        while(left<=right){
            int mid=(left+right)/2;
            if(n[n[0]+1]==n[mid]){
                printf("%d\n",mid);break;
            }
            if(n[n[0]+1]>n[mid])
                left=mid+1;
            else
                right=mid-1;
        }
        if(left>right)
            printf("-1\n");
    }
}
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值