蓝桥训练3

一、Anagrams问题  

问题描述

  Anagrams指的是具有如下特性的两个单词:在这两个单词当中,每一个英文字母(不区分大小写)所出现的次数都是相同的。例如,“Unclear”和“Nuclear”、“Rimon”和“MinOR”都是Anagrams。编写一个程序,输入两个单词,然后判断一下,这两个单词是否是Anagrams。每一个单词的长度不会超过80个字符,而且是大小写无关的。
  输入格式:输入有两行,分别为两个单词。
  输出格式:输出只有一个字母Y或N,分别表示Yes和No。
  输入输出样例

样例输入

Unclear
Nuclear

样例输出

Y

C++:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
#include<algorithm>
#include<cmath>
using namespace std;
char s1[80], s2[80];
int flag = 1;
int main()
{
    scanf("%s",&s1);
    scanf("%s",&s2);
    int len1 = strlen(s1);
    int len2 = strlen(s2);
    for(int i=0;i<len1;i++)
    {
        if(s1[i]>='a'&&s1[i]<='z')
            s1[i]-=32;
    }
    for(int i=0;i<len2;i++)
    {
        if(s2[i]>='a'&&s2[i]<='z')
            s2[i]-=32;
    }
    sort(s1,s1+len1);
    sort(s2,s2+len2);
    if(len1!=len2)
        printf("N\n");
    else
    {
        for(int i=0; i<len1; i++)
        {
            if(s1[i]!=s2[i])
                flag = 0;
        }
        if(flag==0)
            printf("N\n");
        else
            printf("Y\n");
    }
    return 0;
}

Java:

import java.util.Arrays;
import java.util.Scanner;
public class Main 
{
	public static int flag = 1;
	public static char s11[] = new char[80];
	public static char s22[] = new char[80];
	public static void main(String[] args) 
	{
		// TODO Auto-generated method stub
		Scanner cin = new Scanner(System.in);
		String s1, s2;
		s1 = cin.nextLine();
		s2 = cin.nextLine();
		int len1 = s1.length();
		int len2 = s2.length();
		for(int i=0; i<len1; i++)
		{
			s11[i] = s1.charAt(i);
		}
		for(int i=0; i<len2; i++)
		{
			s22[i] = s2.charAt(i);
		}
		for(int i=0;i<len1;i++)
	    {
	        if(s11[i]>='a'&&s11[i]<='z')
	            s11[i]-=32;
	    }
	    for(int i=0;i<len2;i++)
	    {
	        if(s22[i]>='a'&&s22[i]<='z')
	            s22[i]-=32;
	    }
	    Arrays.sort(s11, 0, len1);
	    Arrays.sort(s22, 0, len2);
	    if(len1!=len2)
	        System.out.println("N");
	    else
	    {
	        for(int i=0; i<len1; i++)
	        {
	            if(s11[i]!=s22[i])
	                flag = 0;
	        }
	        if(flag==0)
	            System.out.println("N");
	        else
	            System.out.println("Y");
	    }
	}

}

二、Torry的困惑(基本型)  

问题描述

  Torry从小喜爱数学。一天,老师告诉他,像2、3、5、7……这样的数叫做质数。Torry突然想到一个问题,前10、100、1000、10000……个质数的乘积是多少呢?他把这个问题告诉老师。老师愣住了,一时回答不出来。于是Torry求助于会编程的你,请你算出前n个质数的乘积。不过,考虑到你才接触编程不久,Torry只要你算出这个数模上50000的值。

输入格式

  仅包含一个正整数n,其中n<=100000。

输出格式

  输出一行,即前n个质数的乘积模50000的值。

样例输入

<span style="color:#333333">1
</span>

样例输出

2

C++:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
#include<algorithm>
#include<cmath>
using namespace std;
int n, i, re=1;
int sum = 0, num = 1;
int main()
{
    scanf("%d",&n);
    while(n!=sum)
    {
        num++;
        for(i=2; i<sqrt(num); i++)
        {
            if(num%i==0)
                break;
        }
        if(i>sqrt(num))
        {
            sum++;
            re=(re*num)%50000;
        }
    }
     printf("%d\n",re);
    return 0;
}

Java:

import java.util.Scanner;
public class Main 
{
	public static void main(String[] args) 
	{
		// TODO Auto-generated method stub
		Scanner cin = new Scanner(System.in);
		int n = cin.nextInt();
		int i;
		int sum = 0, num = 1, re = 1;
		while(n!=sum)
		{
			num++;
			for(i=2; i<Math.sqrt(num); i++)
			{
				if(num%i==0)
					break;
			}
			if(i>Math.sqrt(num))
			{
				sum++;
				re = (re*num)%50000;
			}
		}
		System.out.println(re);
	}
}

三、未名湖边的烦恼  

问题描述

  每年冬天,北大未名湖上都是滑冰的好地方。北大体育组准备了许多冰鞋,可是人太多了,每天下午收工后,常常一双冰鞋都不剩。
  每天早上,租鞋窗口都会排起长龙,假设有还鞋的m个,有需要租鞋的n个。现在的问题是,这些人有多少种排法,可以避免出现体育组没有冰鞋可租的尴尬场面。(两个同样需求的人(比如都是租鞋或都是还鞋)交换位置是同一种排法)

输入格式

  两个整数,表示m和n

输出格式

  一个整数,表示队伍的排法的方案数。

样例输入

3 2

样例输出

5

数据规模和约定

  m,n∈[0,18]
问题分析

这是一种类似汉诺塔问题的题目,首先要保证换鞋的人m 多于借鞋的人n。否则,无论怎么排序,都是会出现无鞋可借的尴尬局面。

所以,首先判断(m>n),否则返回0,表示没有方法来排序。

之后,当还鞋的人数n为0 的时候,这时候无论怎么排序都是一种方法,所以这时候函数返回的是1;

AABB A

ABAB A

AAAB B

AABA B

ABAA B


找到的规律是,它的上一步是要么2还2借,下一次为还,要么3还1借,下一次是借

A:当还鞋人数为1人,借鞋人数为1人时,只有一种排法,即HJ,站在第一个的必须要是还鞋的。

B:当还鞋人数为2人,借鞋人数为1人时,有2种排法,即HJH  HHJ

C:当还鞋人数为2人,借鞋人数为2人时,有2种排法,即HJHJ  HHJJ

D:当还鞋人数为3人,借鞋人数为1人时,有3种排法,即HJHH  HHJH   HHHJ

E:当还鞋人数为3人,借鞋人数为2人时,有5种排法,即HJHJH  HHJJH   HJHHJ  HHJHJ   HHHJJ

仔细观察,你可以发现,在E情况中,后三种排法是在D情况中的最后一个加上一个借鞋的人,前两种排法是在C情况中的最后一个加上一个还鞋的人。所以这是一个递归问题,可以推出 solve(x, y)  =  solve(x-1, y) + solve(x, y-1);


C++:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
#include<algorithm>
#include<cmath>
using namespace std;
int m, n;
int solve(int m, int n)
{
	int sum;
	if(m<n)
        sum = 0;
	else if(n==0)
        sum = 1;
	else
        sum = solve(m-1,n-1);
        return sum;
}
int main()
{
	int m,n;
	scanf("%d%d",&m, &n);
	printf("%d",solve(m,n));
	return 0;
}
Java:
import java.util.Scanner;
public class Main 
{
	public static int n, m;
	public static void main(String[] args) 
	{
		// TODO Auto-generated method stub
		Scanner cin = new Scanner (System.in);
		m = cin.nextInt();
		n = cin.nextInt();
		int re = solve(m, n);
		System.out.println(re);
	}
	private static int solve (int m, int n)
	{
		int sum;
		if(m<n)
			sum = 0;
		else if(n==0)
			sum  = 1;
		else
			sum = solve(m-1, n)+solve(m, n-1);
		return sum;
	}
}

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值