2022年春季学期《算法分析与设计》练习4

1036: 字符识别?

题目描述

你的任务是写一个程序进行字符识别。别担心,你只需要识别1, 2, 3,如下:

.*.  ***  ***

.*.  ..*  ..*

.*.  ***  ***

.*.  *..  ..*

.*.  ***  ***

输入

输入仅包含一组数据,由6行组成。第一行为字符的个数n(1<=n<=10)。以下5行每行包含4n个字符。每个字符恰好占5行3列,然后是一个空列(用"."填充)。

输出

输出应包含一行,即识别出的各个字符。

样例输入 Copy

3
.*..***.***.
.*....*...*.
.*..***.***.
.*..*.....*.
.*..***.***.

样例输出 Copy

123
#include<stdio.h>
#define MAX 100
int main()
{
    int n,i,k;
    char str[MAX],s[MAX];
    while(~scanf("%d",&n))
    {
        getchar();
        for(i=0;i<5;i++)
        {
            if(i==3)
               scanf("%s",str);
            else
               scanf("%s",s);
        }
        for(i=0;i<n*4;i++)
        {
            if(str[i]=='*')
            {
                if(i%4==1)
                    printf("1");
                else if(i%4==0)
                    printf("2");
                else if(i%4==2)
                    printf("3");
            }
        }
        printf("\n");
    }
   return 0;
}

1407: 数的划分

题目描述

使用递归编写一个程序,求一个正整数n的所有划分个数。
例如,输入3,输出3;输入4,输出5。

输入

多组输入,每一组是一个正整数n。

输出

输出划分数。

样例输入 Copy

3
4

样例输出 Copy

3
5
import java.util.Scanner;
 
public class Main{
public static int f(int n,int m){
    if((n<1)||(m<1))
        return 0;
    else if((n==1)||(m==1))
        return 1;
    else if(n<m)
        return f(n,n);
    else if(n==m)
        return 1+f(n,n-1);
    else
        return f(n,m-1)+f(n-m,m);
}
    public static void main(String[] args) {
        // TODO Auto-generated method stub
Scanner scan=new Scanner(System.in);
while(scan.hasNext()){
    int x=scan.nextInt();
    int sum=f(x,x);
    System.out.println(sum);
}
    }
 
}

2173: 外观数列

题目描述

给定一个正整数 n ,请设计一个递归算法输出外观数列的第 n 项,「外观数列」是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述。
前五项如下:
 
1.     1
2.     11
3.     21
4.     1211
5.     111221
第一项是数字 1
描述前一项,这个数是 1 即 “ 一 个 1 ”,记作 "11"
描述前一项,这个数是 11 即 “ 二 个 1 ” ,记作 "21"
描述前一项,这个数是 21 即 “ 一 个 2 + 一 个 1 ” ,记作 "1211"
描述前一项,这个数是 1211 即 “ 一 个 1 + 一 个 2 + 二 个 1 ” ,记作 "111221"

输入

多组输入,每组输入一个非负整数(n<=30)

输出

输出结果,每个结果占一行
 

样例输入 Copy

1
2
3

样例输出 Copy

1
11
21
import java.util.Scanner;
 
public class Main{
    public static String countAndSay(int n) {
        if(1==n){
            return "1";
        }else if(2==n){
            return "11";
        }else {
            String s=countAndSay(n-1);
            int i=0;
            int count=1;
            String str="";
            for(int j=1;j<s.length();j++){
                if(s.charAt(i)==s.charAt(j)){
                    count++;
                }else{
                    str=str+count+s.charAt(i);
                    count=1;
                    i=j;
                }
            }
            str=str+count+s.charAt(i);
            return str;
        }
    }
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
Scanner scan=new Scanner(System.in);
while(scan.hasNext()){
    int n=scan.nextInt();
    String m=countAndSay(n);
    System.out.println(m);
}
 
    }
 
}

1427: 线性搜索

题目描述

请编写一个程序,输入包含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
import java.util.Scanner;
 
public class Main{
static long n;
static long q;
static long[] s=new long[10000];
static long[] t=new long[500];
    public static void main(String[] args) {
        // TODO Auto-generated method stub
Scanner scan=new Scanner(System.in);
while(scan.hasNext()){
    int c=0;
    n=scan.nextLong();
    for(int i=0;i<n;i++){
        s[i]=scan.nextLong();
    }
    q=scan.nextLong();
    for(int i=0;i<q;i++){
        t[i]=scan.nextLong();
    }
    for(int i=0;i<n;i++){
        for(int j=0;j<q;j++){
            if(t[j]==s[i])
                c++;
        }
    }
    System.out.println(c);
}
    }
 
}

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

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

君临๑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值