第四周习题

编程入门 行业动态 更新时间:2024-10-10 11:22:53

第四周<a href=https://www.elefans.com/category/jswz/34/1769768.html style=习题"/>

第四周习题

习题

  • 1、字符识别
    • 代码
      • 个人理解
  • 2、数的划分
    • 理解
      • 代码
  • 3、幸运人士
    • 代码
      • 理解
  • 4、线性查找
    • 理解
      • 代码
  • 5、二分查找(递归)
    • 理解
      • 代码:
  • 6、二分查找(非递归)
    • 代码

1、字符识别

题目描述

  • 你的任务是写一个程序进行字符识别。别担心,你只需要识别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);elsescanf("%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;
}

【这就是那个文章里的代码哈~】

个人理解

  • 区分数字是看竖着的,那区分1和2、3很简单,区分2和3就要看第四行*的位置,然后把第四行拎出来分析,又可以区分出1和2和3,虽然我知道这么做,可是我不知道怎么下手啊,所以我还是去看了别人的代码~

2、数的划分

题目描述

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

输入

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

输出

  • 输出划分数。

样例输入 Copy

3
4

理解

这个题目我们上课就讲过啦,只要发现其中规律就不难啦~

代码

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

3、幸运人士

题目描述

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

输入

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

输出

  • 输出最后剩下的那个人的位置。

样例输入 Copy

1
2
3

样例输出 Copy

1
2
2

代码

import java.util.Scanner;public class Main {static int h=1;static int sum=0;public void cbb(int n){if(n==1)System.out.println(1);else{while(n>1) {for(int i=1;h<=n;i++) {h=2*h;	        		}n=n/2;sum=h/2;	        		}System.out.println(sum);}}public static void main(String[] args) {// TODO Auto-generated method stubScanner sc=new Scanner(System.in);Main m = new Main();while(sc.hasNext()) {int n=sc.nextInt();m.cbb(n);}}
}

【 我最早看到的那一篇文章找不到了~】

理解

  • 说白了,我知道题目让你干嘛,也知道有一个规律,只可意会不可言传,急的我室友专门写了一篇博客讲这个题目的思路以及规律,就是下面的链接哈~

链接:幸运人士–Anna Qiao

4、线性查找

题目描述

  • 请编写一个程序,输入包含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

理解

我的第一反应任然是打开了CSDN,对的,没错,可是我发现我不会C++啊,然后就自己写了,但也算是接住了CSDN别人的博客去理解题目了:利用循环,遇到相等的数值就是计数,然后输出就行

代码

import java.util.Scanner;public class Main {public static void main(String[] args) {// TODO Auto-generated method stubScanner sc = new Scanner(System.in);int bb[]= new int[1000];while(sc.hasNext()){int n = sc.nextInt();int S[] = new int[n];for(int i=0;i<n;i++)S[i] = sc.nextInt();int q = sc.nextInt();int T[] = new int[q];for(int i=0;i<q;i++)T[i] = sc.nextInt();if(n<=10000&&q<=500){int geshu = 0;for(int i=0;i<q;i++){for(int j=0;j<n;j++){if(T[i]==S[j]){geshu++;}							}}System.out.println(geshu);	}}}}

5、二分查找(递归)

题目描述

  • 使用递归算法,实现二分搜索。

输入

  • 多组数据输入,每组第一个数字为数组的长度n,然后输入n个整数,最后输入待查询的值。

输出

  • 输出待查询值所在的位置,如果没有找到,则返回-1。

样例输入 Copy

3 1 2 3 2
4 0 1 3 4 2 

样例输出 Copy

2
-1

理解

这个我们老师也讲过,就是不断二分,但是编译的过程中,我还是发现自己得不出结果,然后我又打开了CSDN,还是发现运行错误,最后不断改代码,终于,改对了,因为我自己定义数组的长度为100,而后面,输入的第一个数n,也就是即将输入的n个数,数组的长度应该是shuzu[n],但是因为我首先就确定了数组的长度,所以不管我怎么查找,都返回-1,幸好最后改对了,唉(表述不准确之处还望海涵)

下面是我当时看得代码,后面我自己修改了些地方,有需要的记得戳一戳蓝色字体哟!
链接:二分查找算法(递归与非递归两种方式)

代码:

import java.util.Scanner;public class Main {public static int cbb(int[] shuzu, int low, int high, int key) {if (shuzu == null || shuzu.length == 0) {return -1;}int middle = (low + high) / 2;if (low > high) {return -1;}if (shuzu[middle] == key) {return middle+1;//这是我根据题目要求的输出改的,所以大家一定要看清楚题目要求的输出呀} else if (shuzu[middle] > key) {return cbb(shuzu, low, middle - 1, key);} else {return cbb(shuzu, middle + 1, high, key);}}public static void main(String[] args){Scanner sc = new Scanner(System.in);Main main = new Main();while(sc.hasNext()){int n = sc.nextInt();int []shuzu = new int[n];for(int i=0;i<n;i++){shuzu[i]=sc.nextInt();}int key = sc.nextInt();				System.out.println(Main.cbb(shuzu, 0, n-1, key));}}}

6、二分查找(非递归)

代码

import java.util.Scanner;public class Main {public static int cbb(int shuzu[], int key) {int mid = shuzu.length / 2;if (key == shuzu[mid]) {return mid+1;//根据题目要求来的~}int low= 0;int high = shuzu.length - 1;while (low<= high) {mid = (high - low) / 2 + low;if (key < shuzu[mid]) {high = mid - 1;} else if (key > shuzu[mid]) {low = mid + 1;} else {return mid+1;}}return -1;}public static void main(String[] args){Scanner sc = new Scanner(System.in);Main main = new Main();while(sc.hasNext()){int n = sc.nextInt();int []shuzu = new int[n];//当时就卡在了我自己定义的数组长度这for(int i=0;i<n;i++){shuzu[i]=sc.nextInt();}int key = sc.nextInt();	System.out.println(Main.cbb(shuzu, key));}}
}

更多推荐

第四周习题

本文发布于:2024-03-05 12:44:45,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1712330.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:习题

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!