一,C++字符串:
字符串由一个或多个字符构成,如:"hello" "abc123"等(字符常量:'a',字符串常量 "a"),C++字符串要存在字符数组(字符类型的数组)中,字符串存储时以'\0'作为字符串结束标记,因此定义字符数组的时,必须考虑到'\0'所占的空间。如将字符串"zhang"在数组中的存储形式如下:
定义字符数组:
char a[6];
字符串的输入:
cin>>a;
字符串的输出:
cout<<a;
字符串常用函数:
C++中系统提供了一些常见的字符串处理函数,使用前一般需包含字符串处理头函数即:#include <cstring>
1.字符串求长度函数
函数名:strlen(a)
功能:返回字符串中字符的个数
2.字符串赋值函数
函数名:strcpy(a,b)
功能:将字符串b中的每个字符赋值到字符串a里面
3.字符串比较函数
函数名:strcmp(a,b)
功能:按照ASCII码“字典序”比较字符串a中和字符串b中每个字符的大小
如果a>b返回1
如果a=b返回0
如果a<b返回-1
4. 字符串连接函数
函数名:strcat(a,b)
功能:将字符串b,连接在字符串a的后面,返回整个字符串的值。
另外:
关于字符串处理函数可以自己设计程序实现,如求字符串长度的函数段如下:
char a[10];
int i,cs=0;
cin>>a;
for(i=0;a[i]!= '\0';i++) cs++;
cout<<cs;
ASCII码:
计算机中用得最广泛的字符集及其编码,是由美国国家标准局(ANSI)制定的ASCII码(American Standard Code for Information Interchange,美国标准信息交换码),它已被国际标准化组织(ISO)定为国际标准,称为ISO 646标准。适用于所有拉丁文字字母,ASCII码有7位码和8位码两种形式。
常见字符的ASCII码:
'A'—>65 'a'—>97 '0'—>48 空格—>32 回车—>13
例题:
1.ISBN号码
【问题描述】
每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括9位数字、1位识别码和3位分隔符,其规定格式如“x-xxx-xxxxx-x”,其中符号“-”是分隔符(键盘上的减号),最后一位是识别码,例如0-670-82162-4就是一个标准的ISBN码。ISBN码的首位数字表示书籍的出版语言,例如0代表英语;第一个分隔符“-”之后的三位数字代表出版社,例如670代表维京出版社;第二个分隔之后的五位数字代表该书在出版社的编号;最后一位为识别码。
识别码的计算方法如下:
首位数字乘以1加上次位数字乘以2……以此类推,用所得的结果mod 11,所得的余数即为识别码,如果余数为10,则识别码为大写字母X。例如ISBN号码0-670-82162-4中的识别码4是这样得到的:对067082162这9个数字,从左至右,分别乘以1,2,…,9,再求和,即0×1+6×2+……+2×9=158,然后取158 mod 11的结果4作为识别码。
你的任务是编写程序判断输入的ISBN号码中识别码是否正确,如果正确,则仅输出“Right”;如果错误,则输出你认为是正确的ISBN号码。
【输入】
输入文件isbn.in只有一行,是一个字符序列,表示一本书的ISBN号码(保证输入符合ISBN号码的格式要求)。
【输出】
输出文件isbn.out共一行,假如输入的ISBN号码的识别码正确,那么输出“Right”,否则,按照规定的格式,输出正确的ISBN号码(包括分隔符“-”)。
【输入输出样例1】
isbn.in | isbn.out |
0-670-82162-4 | Right |
【输入输出样例2】
isbn.in | isbn.out |
0-670-82162-0 | 0-670-82162-4 |
answer:
#include <iostream>
using namespace std;
//ifstream cin("isbn.in");
//ofstream cout("isbn.out");
int main()
{
char m[13],a[12]={1,0,2,3,4,0,5,6,7,8,9,0};
cin>>m;
int i,x=0;
for(i=0;i<12;i++) x=a[i]*int((m[i])-48)+x;
x=x%11;
if(x==(int(m[12])-48))cout<<"Right"<<endl;
else
{
m[12]='\0';
cout<<m<<x<<endl;
}
system("pause");
return 0;
}
2.字符串翻转
answer:
#include <iostream>
using namespace std;
//ifstream cin("reverse.in");
//ofstream cout("reverse.out");
int main()
{
char a[12];
cin>>a;
int i,x,bj=0;
x=strlen(a);
if(a[0]=='-')
{
cout<<'-';
bj=1;
}
if(a[x-1]=='0')x=x-1;
for(i=x-1;i>=bj;i--)cout<<a[i];
cout<<endl;
system("pause");
return 0;
}
3.信号追踪
【问题描述】
在电影里我们常常可以看到这样的镜头,通过在犯罪分子身上安装的信号发射装置,警方可以持续不断的知道犯罪分子的位置。现在请你根据下面这个地图来追踪罪犯(地图中字母固定、字母位置固定、地图四周是墙):
图中每个字符代表一个位置,现在你不断地接收到一些位置信号,那么请你编写程序计算从信号开始到信号结束目标至少移动了多少距离,在本地图中,只能上下左右四个方向移动,相邻两个单元格的移动距离为1。例如接受信号如:BJOI,那么移动顺序为B-J-O-I,最少移动距离7。
【输入文件】(sig.in):
一行字符串(长度不超过100个字符),代表你所连续接受到的位置信号。
字母全部大写,in文件最后以输入回车为结束。
【数据限制】:
本题10个测试数据,其中每个测试数据不超过100个字符,且保证不会出现地图上没有出现过的字符。
【输出文件】(sig.out):
一个整数,代表最少移动距离。
【样例输入】:
BJOI
【样例输出】:
7
answer:
#include <iostream>
#include <math.h>
using namespace std;
int main()
{
char a[101];
cin>>a;
int i,la,x1,x2,y1,y2,s;
s=0;
la=strlen(a);
for(i=0;i<la-1;i++)
{
x1=(a[i]-65)/4;
y1=(a[i]-65)%4;
x2=(a[i+1]-65)/4;
y2=(a[i+1]-65)%4;
s=s+fabs(x1-x2)+fabs(y1-y2);
}
cout<<s<<endl;
system("pause");
return 0;
}
4.统计单词
【问题描述】
小明在学习英语单词,一边读,一边敲进stattis.in文件中。学习完后,他想统计一下某个特定的单词敲过多少次。
例如:computer true hello computer key word hi hello.统计computer单词的个数是2。输入的每个单词之间只有一个空格,最后以英文句号‘.’为终止符。输入要求:开头就是单词,单词之间只有一个空格,除了英文句号‘.’之外,不存在其他特殊字符。输入的字符的总长度(包括空格)<=200。需要统计的单词长度<=10。
【输入文件】
文件名:stattis.in
文件中第一行为输入的单词内容,第二行为需要统计的单词,以回车字符为结束。
【输出文件】
文件名:stattis.out
单词出现次数。
【样例输入】
computer true hello computer key word hi hello.
computer
【样例输出】
2
answer:
#include <iostream>
using namespace std;
int main()
{
char a[1001],b[1001],c[1001];
cin.getline(a,1001);
cin>>b;
int i,j,t,js=0,cs=0;
t=0;
for(i=0;a[i]!='\0';i++)
{
t=0;
while(a[i]!=' '&& a[i]!='.')
{
c[t]=a[i];
t++;
i++;
}
c[t]='\0';
if(strcmp(b,c)==0)
js++;
}
cout<<js<<endl;
system("pause");
return 0;
}
5.机器翻译:
小晨的电脑上安装了一个机器翻译软件,他经常用这个软件来翻译英语文章。这个翻译软件的原理很简单,它只是从头到尾,依次将每个英文单词用对应的中文含义来替换。对于每个英文单词,软件会先在内存中查找这个单词的中文含义,如果内存中有,软件就会用它进行翻译;如果内存中没有,软件就会在外存中的词典内查找,查出单词的中文含义然后翻译,并将这个单词和译义放入内存,以备后续的查找和翻译。
假设内存中有M 个单元,每单元能存放一个单词和译义。每当软件将一个新单词存入内存前,如果当前内存中已存入的单词数不超过M−1,软件会将新单词存入一个未使用的内存单元;若内存中已存入M 个单词,软件会清空最早进入内存的那个单词,腾出单元来,存放新单词
假设一篇英语文章的长度为N 个单词。给定这篇待译文章,翻译软件需要去外存查找多少次词典?假设在翻译开始前,内存中没有任何单词。
input:
3 7
1 2 1 5 4 4 1
output:
5
#include <iostream>
using namespace std;
//ifstream cin("translate.in");
//ofstream cout("translate.out");
int main()
{
int a,b,i,j,js=0,x,s=0;cin>>a>>b;
int neicun[a];memset(neicun,-1,sizeof(neicun));
for(i=0;i<b;i++)
{
cin>>x;
for(j=0;j<js;j++) if(neicun[j]==x)goto a;
s++;
if(js==a)
{
memcpy(neicun,neicun+1,4*a-4);
neicun[a-1]=x;
}
else {neicun[js]=x;js++;}
a:;
}
cout<<s<<endl;
//system("pause");
return 0;
}
二,高精度计算:
用字符数组存储大数字的每一位数,分别完成运算,输出字符数组所有数字;
高精度加法:
#include <iostream>
using namespace std;
char a[1001],b[1001];
int x[1000],y[1000],s[1001];
int main()
{
int i,la,lb;
char t[1001];
cin>>a>>b;//保证a>b
la=strlen(a);
lb=strlen(b);
if(la<lb)
{
strcpy(t,a);
strcpy(a,b);
strcpy(b,t);
swap(la,lb);
}
for(i=0;i<la;i++)x[i]=(int)a[la-i-1]-48;
for(i=0;i<lb;i++)y[i]=(int)b[lb-i-1]-48;
int temp;
for(i=0;i<la;i++)
{
temp=x[i]+y[i]+s[i];
if(temp>=10)
{
s[i+1]++;
s[i]=temp%10;
}
else s[i]=temp;
}
for(i=1001;i>=0;i--)
if(s[i]!=0)break;
int j;
for(j=i;j>=0;j--)cout<<s[j];
system("pause");
return 0;
}
例题:
麦森数:
形如2P-1的素数称为麦森数,这时P一定也是个素数。但反过来不一定,即如果P是个素数,2P-1不一定也是素数。到1998年底,人们已找到了37个麦森数。最大的一个是P=3021377,它有909526位。麦森数有许多重要应用,它与完全数密切相关。
任务:从文件中输入P(1000<P<3100000),计算2P-1的位数和最后500位数字(用十进制高精度数表示)
输入:1279
输出:
386
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010407932194664399081925240327364085538615262247266704805319112350403608059673360298012239441732324184842421613954281007791383566248323464908139906605677320762924129509389220345773183349661583550472959420547689811211693677147548478866962501384438260291732348885311160828538416585028255604666224831890918801847068222203140521026698435488732958028878050869736186900714720710555703168729087
answer1:
#include <iostream>
#include <math.h>
using namespace std;
int a[501],s[501],q[3100000];
int cheng2()
{
int i;
for(i=500;i>=0;i--)
{
s[i]+=a[i]*2;
s[i-1]+=s[i]/10;
s[i]%=10;
}
}
int pingfang()
{
int i,j,ss[501],q=500,p=500;
for(i=500;i>=0;i--)
{
p=q;
memset(ss,0,sizeof(ss));
for(j=500;j>=0;j--)
{
ss[p]+=a[j]*a[i];
ss[p-1]+=ss[p]/10;
ss[p]%=10;
p--;
if(p==0)break;
}
for(j=500;j>=0;j--)
{
s[j]+=ss[j];
s[j-1]+=s[j]/10;
s[j]%=10;
}
q--;
}
}
int main()
{
int n,i,j,m;
cin>>n;
m=n;
s[500]=1;
cout<<int(n*log10(2)+1)<<endl;
for(i=0;;i++)
{
if(m==0)break;
if(m%2==0)
{
q[i]=2;
m/=2;
}
else
{
q[i]=1;
m--;
}
}
for(i--;i>=0;i--)
{
for(j=0;j<501;j++)a[j]=s[j];
memset(s,0,sizeof(s));
if(q[i]==2)
{
pingfang();
}
else if(q[i]==1)
{
cheng2();
}
}
s[500]--;
for(i=0;i<501;i++)cout<<s[i];
system("pause");
return 0;
}
answer2:
#include<iostream>
#include<cmath>
#include<iomanip>
using namespace std;
int a[502],b[502];
void mul(int *x,int *y){
int c[501];
memset(c,0,sizeof(c));
for(int i=1;i<=500;++i)
for(int j=1;j<=500-i+1;++j)
c[i+j-1]+=x[i]*y[j];
for(int i=1;i<=500;++i){
c[i+1]+=c[i]/10;
c[i]%=10;
}
memcpy(x,c,sizeof(int)*502);
}
int main()
{
int p;
cin>>p;
cout<<int(p*log10(2)+1)<<endl;
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
b[1]=2; a[1]=1;
while(p){
if(p&1) mul(a,b);
p>>=1;
mul(b,b);
}
a[1]--;
for(int i=1;i<=500;++i)
if(a[i]<0)
{
a[i+1]--;
a[i]+=10;
}
for(int i=500;i>=1;--i) cout<<a[i];
cout<<endl;
return 0;
}