1.1两数求和
略
2.1字符串插入(10分)
题目内容: 有两个字符串str和substr,str和substr的字符个数不超过10^5,只包含大小写字母和数字。(字符个数不包括字符串结尾处的’\0’。)将substr插入到str中ASCII码最大的那个字符后面,若有多个最大则只考虑第一个。
输入格式:
输入数据只有一行,格式为
str substr
输出格式:
输出插入之后的字符串。
输入样例:
abcab eee
输出样例:
abceeeab
时间限制:500ms内存限制:32000kb
答案:
#include<iostream>
using namespace std;
int main()
{
string a,b;
cin>>a>>b;
int key=0;
for(int i=1;i<a.length();i++)
{
if(a[i]>a[key])
key=i;
}
for(int j=0;j<=key;j++)
{
cout<<a[j];
}
cout<<b;
for(int j=key+1;j<a.length();j++)
{
cout<<a[j];
}
return 0;
}
2.2大整数乘法(10分)
题目内容: 求两个不超过200位的非负整数的积。
输入格式: 有两行,每行是一个不超过200位的非负整数,没有多余的前导0。
输出格式: 一行,即相乘后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342。
输入样例:
12345678900
98765432100
输出样例:
1219326311126352690000
时间限制:500ms内存限制:32000kb
答案:
#include<iostream>
#include<cmath>
#include<string>
#include<cstring>
using namespace std;
int main()
{
string a,b;
cin>>a>>b;
int n=a.length()+b.length();
int *s=new int[n];
for(int i=0;i<n;i++)
{
s[i]=0;
}
cout<<endl;
for(int i=0;i<a.length();i++)
{
for(int j=0;j<b.length();j++)
{
s[i+j+1]+=(a[i]-'0')*(b[j]-'0');
}
}
for(int i=a.length()+b.length()-1;i>0;i--)
{
if(s[i]>9)
{
s[i-1]+=s[i]/10;
s[i]%=10;
}
}
int c=0;
for(int i=0;i<n;i++)
{
if(s[i]==0)
c++;
else
break;
}
for(int i=c;i<n;i++)
{
cout<<s[i];
}
if (c==n)
{
cout<<0;
}
return 0;
}
2.3约瑟夫问题(10分)
题目内容: 有n只猴子,按顺时针方向围成一圈选大王(编号从1到n),从第1号开始报数,一直数到m,数到m的猴子退出圈外,剩下的猴子再接着从1开始报数。就这样,直到圈内只剩下一只猴子时,这个猴子就是猴王,编程求输入n,m后,输出最后猴王的编号。
输入格式: 输入包含两个整数,第一个是n,第二个是m (0 < m,n <=300)。
**输出格式:**输出包含一行,即最后猴王的编号。
输入样例:
18 2
输出样例:
5
时间限制:500ms内存限制:32000kb
答案: 前一个是带头结点的,后一个是不带头结点的。
#include<iostream>
using namespace std;
struct Node
{
int data;
Node *next;
};
void SetList(Node *head,int n)
{
Node *tail=head;
for (int i=0;i<n;i++)
{
Node *s=new Node;
s->data=i+1;
tail->next=s;
tail=s;
}
tail->next=head;
}
void DelNode(Node *head,int m)
{
Node *flag=head;
while (head->next->next!=head)
{
for (int i=0;i<m-1;i++)
{
if(flag->next!=head)
flag=flag->next;
else
flag=head->next;
}
Node *d=flag->next;
if(d==head)
{
d=d->next;
flag=flag->next;
}
flag->next=d->next;
delete d;
}
}
int main()
{
int n,m;
cin>>n>>m;
Node *head=new Node;
head->next=head;
SetList(head,n);
DelNode(head,m);
cout<<head->next->data;
return 0;
}
#include<iostream>
#include<string>
using namespace std;
struct node
{
int data;
node * next;
};
int main ( )
{
node *p=new node;
node *head=p;
int n,m;
cin>>n>>m;
for (int i=1;i<n;i++)
{
p->data=i;
p->next=new node;
p=p->next;
}
p->data=n;
p->next=head;
p=head;
while(p->next!=p)
{
for (int i=0;i<m-2;i++)
{
p=p->next;
}
node *q=p->next;
p->next=q->next;
delete q;
p=p->next;
}
cout<<p->data<<endl;
return 0;
}
3.3密码翻译(10分)
题目内容: 在情报传递过程中,为了防止情报被截获,往往需要对情报用一定的方式加密,简单的加密算法虽然不足以完全避免情报被破译,但仍然能防止情报被轻易的识别。我们给出一种最简的的加密方法,对给定的一个字符串,把其中从a-y,A-Y的字母用其后继字母替代,把z和Z用a和A替代,则可得到一个简单的加密字符串。
输入格式:
第一行是字符串的数目n。
其余n行每行一个字符串。
输出格式:
输出每行字符串的加密字符串。
输入样例:
1
Hello! How are you!
输出样例:
Ifmmp! Ipx bsf zpv!
时间限制:500ms内存限制:32000kb
答案:
#include<iostream>
using namespace std;
int main()
{
int n;
cin>>n;
getchar();
string a;
while(n!=0)
{
getline(cin,a);
for(int i=0;i<a.length();i++)
{
if(a[i]>='a'&&a[i]<='z')
a[i]='a'+(a[i]-'a'+1)%26;
else if(a[i]>='A'&&a[i]<='Z')
a[i]='A'+(a[i]-'A'+1)%26;
}
cout<<a<<endl;
n--;
}
return 0;
}