1.
给定一个字符串,把字符串内的字母转换成该字母的下一个字母,a换成b,z换成a,Z换成A,如aBf转换成bCg,字符串内的其他字符不改变,给定函数,编写函数
void Stringchang(const char*inpu,char*output)
其中input是输入字符串,output是输出字符串。
#include <iostream>
using namespace std;
void Stringchange(const char* input,char* output)
{
int i,n=strlen(input);
char s;
for(i=0;i<n;i++)
{
if(input[i]>='a'&&input[i]<'z')
s=input[i]+1;
else if(input[i]=='z'||input[i]=='Z')
s=input[i]-25;
else if(input[i]>='A'&&input[i]<'Z')
s=input[i]+1;
else
s=input[i];
output[i]=s;
}
output[n]='\0';
}
void main()
{
char* input=new char[100];
char* output=new char[100];
cin.getline(input,100);
Stringchange(input,output);
cout<<output<<endl;
delete []input;
delete []output;
}
注:定义的字符指针使用前要分配内存空间。'a'指的是a的ASCII码。
2.
求一个整型数字中有没有相同的部分,例如12386123这个整型数字中相同的部分是123,相同的部分至少应该是2位数,如果有相同部分返回1,如果没有则返回0。方法是先将整型数字转换到数组中,再判断。
函数为 int same(int num)
其中num是输入的整型数字。
#include <iostream>
using namespace std;
int same(int num)
{
int n[100],i=0;
while(num)
{
n[i]=num%10;//倒序存储
num=num/10;
i++;
}
n[i]='\0';
for(int j=0;j<i-1;j++)
for(int t=2;j+t<i-1;t++)
{
if(n[j]==n[j+t]&&n[j+1]==n[j+t+1]) return 1;
}
return 0;
}
void main()
{
int num;
cin>>num;
int m=same(num);
cout<<m<<endl;
}
#include <iostream>
using namespace std;
int same(int num)
{
int* str=new int[100];
int m=0;
while(num>0)
{
str[m]=num%10;
num=num/10;
m++;
}
str[m]='\0';
for(int i=0;i<m-3;i++)
{
for(int j=i+2;j<m-1;j++)
{
if(str[i]==str[j]&&str[i+1]==str[j+1])
return 1;
}
}
return 0;
delete []str;
}
void main()
{
int num;
cin>>num;
int l=same(num);
cout<<l<<endl;
}
注:将int型转为int数组(循环对个位数取值);寻找相同数时先指定两位相邻数,再一一同后面的两两相邻数相对比。(测试用例不要超出int的表示范围)
求两个字符串的乘积,结果存到字符串中,例如字符串一中存的“657891”,字符串二中存的“521”,分别将字符串中的字符转换成整型数字,进行计算后,再转换成字符类型存储起来。
函数为 void mul(char *input1,int n,char *input2, intm,char *output)
其中input1和input2是输入,n是input1的长度,n2是input2的长度。Output是输出。
#include <iostream>
#include <cmath>
using namespace std;
void mul(char *input1,int n,char *input2,int m,char *output)
{
int ip1=0,ip2=0,ni=n,mi=m;
int op;
int k=0;
for(int i=0;i<n;i++)
{
ip1=ip1+(input1[i]-'0')*pow(10.0,--ni);
}
for(int i=0;i<m;i++)
{
ip2=ip2+(input2[i]-'0')*pow(10.0,--mi);
}
op=ip1*ip2;
if(op==0)
{
output[0]='0';
output[1]='\0';
return;
}
while(op>0)
{
output[k]=op%10+'0';
op=op/10;
k++;
} //得到的output数组里的数字是倒序
output[k]='\0';
for(int i=0;i<k/2;i++)//数组的前后字符交换
{
char ind;
ind=output[i];
output[i]=output[k-1-i];
output[k-1-i]=ind;
}
}
void main()
{
char pt1[100],pt2[100],opt[100];
cin>>pt1;
cin>>pt2;
int n=strlen(pt1);
int m=strlen(pt2);
mul(pt1,n,pt2,m,opt);
cout<<opt<<endl;
}
注:将字符串每个字符型数字-'0',变为整型再乘上相应位数,最后相加,变为整型数字。进行相乘后,再取每个整型数字变为char型(+'0'),最后交换字符顺序。
4.
子串,只要是原串中有相同的子串就删掉,不管有多少个都删除,返回子串个数。
输入字符串为:123abc12de234fg1hi34j123k,子串为:123
则输出为:abc12de234fg1hi34jk 2
#include<iostream>
#include<cstring>
using namespace std;
int fun(char* str,char* str1,char* output)
{
int n=strlen(str);
int m=strlen(str1);
int k=0,j=0,i;
char tem[100];
for(i=0;i<n-m+1;i++)
{
if(str[i]==str1[0])
{
strncpy(tem,&str[i],m);
tem[m]='\0';
if(strcmp(tem,str1)==0)
{
k++;
i=i+m-1;
continue;
}
}
output[j++]=str[i];
}
for(int l=0;l<m;l++)
output[j++]=str[i++];
return k;
}
void main()
{
char str[100],str1[100],output[100];
cin.getline(str,100);
cin.getline(str1,100);
int k=fun(str,str1,output);
cout<<output<<' '<<k<<endl;
}
#include <iostream>
#include <string>
using namespace std;
int deletesub(string str,string sub,int n)
{
int num=0;
while(1)
{
int m=str.find(sub);
if(m<0) return num;
else
{
str.erase(m,n);
num++;
}
}
}
void main()
{
string str,sub;
getline(cin,str);
cin>>str;//getline(cin,str);
cin>>sub;//getline(cin,sub);
int n=sub.size();
int num=deletesub(str,sub,n);
cout<<num<<endl;
}
注:string类的使用。string::size()返回的是字节数(字母数字占一个字节,汉字占两个),也可用string::length();
string类型的erase()的原型如下:
(1)string& erase ( size_t pos = 0, size_t n = npos );
(2)iterator erase ( iterator position );
(3)iterator erase ( iterator first, iterator last );
也就是说有三种用法:
(1)erase(pos,n); 删除从pos开始的n个字符,比如erase(0,1)就是删除第一个字符
(2)erase(position);删除position处的一个字符(position是个string类型的迭代器)
(3)erase(first,last);删除从first到last之间的字符(first和last都是迭代器)
约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。
#include <iostream>
using namespace std;
typedef struct _node{
int num;
_node *next;
}node;
node *creat(int n)//建立n个元素的循环链表
{
node *p,*q,*head=NULL;
for(int i=1;i<n;i++)
{
p=new node;
p->num=i;
if(i==1)
{
head=p;
}
else
{
q->next=p;//p为present
}
q=p;//q存取的是上一个值previous
}
q->next=head;
return q;
}
int main()
{
int n,k,m;//n为总人数,k为第一个报数的人,m为出列者喊到的数
cin>>n>>k>>m;
node *q,*pre;
q=creat(n);
pre=q; //
q=q->next; //pre永远是q的上一个节点
for(int i=1;i<k;i++)//将q移至开始报数点k
{
pre=q;
q=q->next;
}
while(q->next!=q)
{
for(int i=1;i<m;i++)//将q移至出列点m
{
pre=q;
q=q->next;
}
cout<<q->num<<"->";//打印当前出列点
pre->next=q->next;
delete q;//delete和free函数一样,只是在堆内存管理结构
q=pre->next;//中将指针指向的内容标记为可被重新分配。
}
cout<<q->num<<endl;
delete q;
return 0;
}
第一步:建立一个有n个元素的循环链表,链表是从n的编号开始的。再通过next转到1号节点。
第二步:是从链表的表头数到第 k 个值。
第三步:从 k 的后面开始输入 m 个值,删除该值,继续开始数,继续删,直到剩下一个元素,输出该元素,结束。
#include<iostream>
using namespace std;
struct node //typedef struct _node
{ //{
int num; // int num;
node* next; // struct _node* next;
}; //}node;
node* creat(int n)
{
node *p,*q,*head;
p=new node;
p->num=1;
head=p;
for(int i=2;i<=n;i++)
{
q=new node;
q->num=i;
p->next=q;
p=q;
}
p->next=head;
return head;
}
void link_process(node* head,int k,int m)
{
node *p=head,*temp;
while(p->num!=k)
p=p->next;
while(p->next!=p)
{
for(int i=0;i<m-1;i++)
{
temp=p;
p=p->next;
}
cout<<p->num<<endl;
temp->next=p->next;
delete p;
p=temp->next;
}
cout<<p->num<<endl;
}
void main()
{
int n,k,m;
cin>>n>>k>>m;
node *head=creat(n);
link_process(head,k,m);
}