1036: 字符识别?
题目描述
你的任务是写一个程序进行字符识别。别担心,你只需要识别1, 2, 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");
}
}