一、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;
}
}