ALGO-82. 输出⽶米字形!
根据输⼊入的正整数n (1 ⽶米字形由⼀一个(2n-1)*(2n-1)的矩阵组成,矩阵包含从⼤大写A开始的n个字⺟母
例例如:n=3时,包含A,B,C;n=4时,包含A,B,C,D。
矩阵的正中间为n个字⺟母中字典序最⼤大的那个,从这个字⺟母开始,沿着⻄西北北、正北北、东北北、正⻄西、正
东、⻄西南、正南、东南⼋八个⽅方向各有⼀一条由⼤大写字⺟母组成的直线。并且直线上的字⺟母按字典序依次减
⼩小,直到⼤大写字⺟母A。
矩阵的其它位置⽤用英⽂文句句号.填充。
样例例输⼊入⼀一
3
样例例输出⼀一
A.A.A
.BBB.
ABCBA
.BBB.
A.A.A
样例例输⼊入⼆二
4
样例例输出⼆二
A..A..A
.B.B.B.
..CCC..
ABCDCBA
..CCC..
.B.B.B.
A..A..A
思考:
先把他全部填满‘.’,然后米字型的那样填充
#include <iostream>
#include <algorithm>
char c[1000][1000];
using namespace std;
int main() {
fill(c[0],c[0]+1000*1000,'.');
int n;
cin >> n;
for(int i = 0; i < n; i++){
char ch = 'A' + n - i - 1;
c[n+i][n+i] = c[n-i][n-i]= c[n+i][n-i]= c[n-i][n+i] = ch;
c[n][n+i] = c[n][n-i]= c[n+i][n]= c[n-i][n] = ch;
}
for(int i = 1; i <= 2*n-1; i++){
for(int j = 1; j <= 2*n-1; j++)
cout << c[i][j];
cout << endl;
}
return 0;
}
ALGO-83. 阶乘!
问题描述
⼀一个整数n的阶乘可以写成n!,它表示从1到n这n个整数的乘积。阶乘的增⻓长速度⾮非常快,例例如,13!
就已经⽐比较⼤大了了,已经⽆无法存放在⼀一个整型变量量中;⽽而35!就更更⼤大了了,它已经⽆无法存放在⼀一个浮点型变
量量中。因此,当n⽐比较⼤大时,去计算n!是⾮非常困难的。幸运的是,在本题中,我们的任务不不是去计算
n!,⽽而是去计算n!最右边的那个⾮非0的数字是多少。例例如,5! = 12345 = 120,因此5!最右边的那
个⾮非0的数字是2。再如:7! = 5040,因此7!最右边的那个⾮非0的数字是4。请编写⼀一个程序,输⼊入⼀一个
整数n(n<=100),然后输出n! 最右边的那个⾮非0的数字是多少。
输⼊入格式:输⼊入只有⼀一个整数n。
输出格式:输出只有⼀一个整数,即n! 最右边的那个⾮非0的数字。
输⼊入输出样例例
样例例输⼊入
6
样例例输出
2
#include<iostream>
#include<cmath>
using namespace std;
int main(){
int n,cnt_2=0,cnt_5=0,ans=1;
cin>>n;
for(int i=1;i<=n;i++){
int t=i;
while(t%2==0){
cnt_2++;
t/=2;
}
while(t%5==0){
cnt_5++;
t/=5;
}
ans=ans*t%10;
}
if(cnt_2>cnt_5) ans=ans*pow(2,cnt_2-cnt_5);
else if(cnt_2<cnt_5) ans=ans*pow(5,cnt_5-cnt_2);
cout<<ans%10;
return 0;
}
思考:
1、算出1-n中的每一个有多少个2和5的因子,且记录剩下的结果(注意!因为是求0的钱一个数字,所以塔子需要求一个数字,所以要%10)
2、对比2和5因子的个数,在进行求余%10
ALGO-85. 进制转换
问题描述
编写⼀一个程序,输⼊入⼀一个⼆二进制的字符串串(⻓长度不不超过32),然后计算出相应的⼗十进制整数,并
把它打印出来。
输⼊入格式:输⼊入为⼀一个字符串串,每个字符都是’0’或’1’,字符串串的⻓长度不不超过32。
输出格式:输出⼀一个整数。
输⼊入输出样例例
样例例输⼊入
1101
样例例输出
13
#include<iostream>
#include<cmath>
using namespace std;
int main(){
string s;
cin>>s;
int n=0;
for(int i=0;i<s.length();i++){
if(s[s.length()-1-i]=='1')
n+=pow(2,i);
}
cout<<n;
return 0;
}
ALGO-91. Anagrams问题
问题描述
Anagrams指的是具有如下特性的两个单词:在这两个单词当中,每⼀一个英⽂文字⺟母(不不区分⼤大⼩小
写)所出现的次数都是相同的。例例如,“Unclear”和“Nuclear”、“Rimon”和“MinOR”都是Anagrams。
编写⼀一个程序,输⼊入两个单词,然后判断⼀一下,这两个单词是否是Anagrams。每⼀一个单词的⻓长度不不
会超过80个字符,⽽而且是⼤大⼩小写⽆无关的。
输⼊入格式:输⼊入有两⾏行行,分别为两个单词。
输出格式:输出只有⼀一个字⺟母Y或N,分别表示Yes和No。
输⼊入输出样例例
样例例输⼊入
Unclear
Nuclear
样例例输出
Y
注意:
a[_]里面的_是int型
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int main(){
string s1,s2;
cin>>s1>>s2;
int c1[26],c2[26];
memset(c1,0,sizeof(c1));
memset(c2,0,sizeof(c2));
int flag=1;
for(int i=0;i<s1.length();i++){
if(s1[i]>='a'&&s1[i]<='z')
c1[s1[i]-'a']++;
if(s1[i]>='A'&&s1[i]<='Z')
c1[s1[i]-'A']++;
}
for(int i=0;i<s2.length();i++){
if(s2[i]>='a'&&s2[i]<='z')
c2[s2[i]-'a']++;
if(s2[i]>='A'&&s2[i]<='Z')
c2[s2[i]-'A']++;
}
for (int i = 0; i < 26; i++) {
if (c1[i] != c2[i])
{flag = 0;
break;
}
}
if(flag==0)
cout<<'N';
else cout<<'Y';
return 0;
}
ALGO-92. 前缀表达式
问题描述
编写⼀一个程序,以字符串串⽅方式输⼊入⼀一个前缀表达式,然后计算它的值。
输⼊入格式为:“运算符 对象1 对象2”,其中,运算符为“+”(加法)、“-”(减法)、
“*”(乘法)或“/”(除法),运算对象为不不超过10的整数,它们之间⽤用⼀一个空格隔开。
要求:对于加、减、乘、除这四种运算,分别设计相应的函数来实现。
输⼊入格式:输⼊入只有⼀一⾏行行,即⼀一个前缀表达式字符串串。
输出格式:输出相应的计算结果(如果是除法,直接采⽤用c语⾔言的“/”运算符,结果为整数)。
输⼊入输出样例例
样例例输⼊入
- 5 2
样例例输出
7
#include<iostream>
using namespace std;
void add(int a,int b) {cout<<a+b;}
void min(int a,int b) {cout<<a-b;}
void mul(int a,int b) {cout<<a*b;}
void divid(int a,int b) {cout<<a/b;}
int main(){
string s;
getline(cin,s);
int a,b;
if(s[3]==' '){
a=s[2]-'0';
if(s.length()==5)
b=s[4]-'0';
else{
b=10;
}
}else{
a=10;
if(s.length()==6)
b=s[5]-'0';
else{
b=10;
}
}
if(s[0]=='+') add(a,b);
if(s[0]=='-') min(a,b);
if(s[0]=='*') mul(a,b);
if(s[0]=='/') divid(a,b);
return 0;
}
ALGO-93. 反置数!
问题描述
⼀一个整数的“反置数”指的是把该整数的每⼀一位数字的顺序颠倒过来所得到的另⼀一个整数。如果⼀一个整
数的末尾是以0结尾,那么在它的反置数当中,这些0就被省略略掉了了。⽐比如说,1245的反置数是
5421,⽽而1200的反置数是21。请编写⼀一个程序,输⼊入两个整数,然后计算这两个整数的反置数之和
sum,然后再把sum的反置数打印出来。要求:由于在本题中需要多次去计算⼀一个整数的反置数,因
此必须把这部分代码抽象为⼀一个函数的形式。
输⼊入格式:输⼊入只有⼀一⾏行行,包括两个整数,中间⽤用空格隔开。
输出格式:输出只有⼀一⾏行行,即相应的结果。
输⼊入输出样例例
样例例输⼊入
435 754
样例例输出
199
#include <iostream>
using namespace std;
int re(int n){
int ans = 0;
while(n){
ans = ans * 10 + n % 10;
n /= 10;
}
return ans;
}
int main() {
int a, b;
cin >> a >> b;
cout << re(re(a)+re(b));
return 0;
}
ALGO-94. 新⽣生舞会!
问题描述
新⽣生舞会开始了了。n名新⽣生每⼈人有三个属性:姓名、学号、性别。其中,姓名⽤用⻓长度不不超过20的仅由
⼤大⼩小写字⺟母构成的字符串串表示,学号⽤用⻓长度不不超过10的仅由数字构成的字符串串表示,性别⽤用⼀一个⼤大写
字符‘F’或‘M’表示。任意两⼈人的姓名、学号均互不不相同。换⾔言之,每个⼈人可被其姓名或学号唯⼀一确定。
给出m对两⼈人的信息(姓名或学号),判断他们是否能共舞。两⼈人能共舞的充要条件为两⼈人性别相
异。
输⼊入
第⼀一⾏行行⼀一个整数n(2<=n<=1000),表示学⽣生⼈人数。接下来的n⾏行行每⾏行行依次包含⼀一名新⽣生的姓名、学
号、性别,分别⽤用⼀一个空格隔开。
之后的⼀一⾏行行是⼀一个整数m(1<=m<=1000),表示询问的数⽬目。接着的m⾏行行每⾏行行包含两个信息(姓名或学
号),保证两个信息不不属于同⼀一⼈人,中间⽤用⼀一个空格隔开。
输出
对于每个询问输出⼀一⾏行行,如果两⼈人可以共舞,输出⼀一个⼤大写字⺟母‘Y’,否则输出⼀一个⼤大写字⺟母‘N’。
样例例输⼊入
4
John 10 M
Jack 11 M
Kate 20 F
Jim 21 M
3
John 11
20 Jack
Jim Jack
样例例输出
N
Y
N
分析:1.⽤用map存储名字对应学号,学号对应名字,以及名字和学号分别对应性别
2.判断是不不是本⼈人和性别是否为异性即可~
#include<iostream>
#include<map>
using namespace std;
int main(){
map<string,string>sex;
map<string,string>id_name;
int n,k;
cin>>n;
for(int i=0;i<n;i++){
string id,name,tsex;
cin>>id>>name>>tsex;
id_name[id]=name;
id_name[name]=id;
sex[id]=sex[name]=tsex;
}
cin>>k;
for(int i=0;i<k;i++){
string s1,s2;
cin>>s1>>s2;
if(id_name[s1]!=s2&&sex[s1]!=sex[s2]) cout<<"Y"<<endl;
else cout<<"N"<<endl;
}
return 0;
}