中小学生青少年C++程序设计(NOIP版)-字符数组与字符串_第1页
中小学生青少年C++程序设计(NOIP版)-字符数组与字符串_第2页
中小学生青少年C++程序设计(NOIP版)-字符数组与字符串_第3页
中小学生青少年C++程序设计(NOIP版)-字符数组与字符串_第4页
中小学生青少年C++程序设计(NOIP版)-字符数组与字符串_第5页
已阅读5页,还剩75页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C++程序设计(ForNOIP)字符数组与字符串字符数组的定义与访问字符串的定义与访问字符串的输入ASCII码字符串的常用函数提高练习(高精度计算)主要内容字符数组的定义

char数组名[元素个数];当字符数组用来存放字符串时,要注意字符串中包含了一个字符串结束标志'\0',这个结束标志也要占用一个单元。字符串结束标志‘\0‘是字符串的重要特征。以下的示例通过多种方式定义了字符数组传统C语言字符串–字符数组char

s[1000];//定义未初始化的固定长度字符数组char

s1[4]={‘a’,‘b’,‘c’,‘\0‘};//定义定长的字符数组,以’\0’结尾char

s2[4]={‘a’,‘b’,‘c’,‘d’};//定义定长字符数组,没有’\0’char

s3[]=“hello”;//定义并初始化不定长字符串,末尾自动添加’\0’整个字符数组的访问直接通过数组名对整个字符进行访问字符数组单个元素的访问

通过数组下标访问字符数组中的单个字符元素,下标从0开始字符数组的访问chars3[]="hello";cout<<s3[4];//输出字符’o’chars1[5]={‘a’,‘b’,‘c’,‘d’,‘\0‘};cout<<s1;//输出整个字符数组,不包括’\0’字符串数据类型需要引用<string>库,字符串数据类型有许多的成员函数,如length,replace等字符串的定义以下的示例通过多种方式定义了不同的字符串变量C++中的字符串#include<string.h>//引用<string>库strings1;//定义了未初始化的字符串变量strings2=“helloworld”;//定义并初始化字符串变量strings3(“helloworld”);//定义并初始化字符串变量strings4(8,‘a’);//定义由指定数量的单个重复字符组成的字符串strings5(s2,3,2);//定义由某个现有字符串的子串组成的字符串变量s1=s2;

//字符串变量可以像普通变量一样进行相互赋值整个字符串的访问直接通过字符串变量名对整个字符进行访问字符串中单个字符的访问

字符串变量可以看作一个字符数组,可以通过下标访问字符串中的单个字符C++中字符串变量的访问strings2=“helloworld”;//定义并初始化字符串变量cout<<s2[6];//输出字符’w’strings2=“helloworld”;//定义并初始化字符串变量cout<<s2;//输出整个字符串变量字符串的输入通过cin进行输入cin>>字符串变量;提取操作符

>>

遇到空格、TAB、或回车符停止提取只能接收不带空格的字符串以下的示例先定义了一个字符串变量,然后准备从键盘接收输入的字符串内容stringstr;cin>>s1;//从键盘接收输入的字符串字符串的输入通过getline函数进行输入getline(cin,字符串变量)遇到换行符时才停止获取,所以能够能读取到空格和TAB可以读入整行的字符串,可包括空格和TAB制表符以下的示例先定义了一个空字符串,然后准备从键盘接收输入的字符串内容stringstr;getline(cin,str);//从键盘接收输入的字符串cout<<str;//输出字符串的输入通过cin.getline函数进行输入cin.getline(字符数组名,字符个数,结束标志)遇到换行符时才停止获取,所以能够能读取到空格和TAB第一个参数必须是字符数组名,而不是字符串变量如果指定参数“字符个数”为n,则利用cout函数输出时只显示字符数组中的前n-1个字符,第n个字符是不可见字符’\0’如果指定了参数“结束标志”,则在读取过程中,如果遇到结束标志,即使读取的字符数还未达到指定的“字符个数”,也会停止读取当第三个参数省略时,系统默认为'\0'字符串的输入通过cin.getline函数进行输入cin.getline(字符数组名,字符个数,结束标志)以下的示例分别演示了接收定长字符串和提前遇到结束字符两种情形chars1[10];//从键盘接收输入的字符串//最多接收7个字符cin.getline(s1,8);//如果输入abcdefghl//则会输出abcdefcout<<s1;chars2[10];//从键盘接收输入的字符串//最多接收7个字符,以’f’为结束字符cin.getline(s1,8,‘f’);//如果输入abcdefghl//则会输出abcdecout<<s1;字符串的输入通过gets()函数进行输入cin.getline(字符数组名)遇到换行符时才停止获取,所以能够能读取到空格和TAB参数必须是字符数组名,而不是字符串变量能够接收到的字符数量为:数组长度-1,最后一个字符自动为’\0’下面的示例定义了字符数组,并通过gets()函数从键盘接收字符串chars1[10];gets(s1);//如果输入abcdefghl(共10个字符,包括空格)//则会输出abcdefgh(只接收9个,包括空格,最后一个自动填充’\0’)cout<<s1;字符串的连接可以使用+或+=来连接C++字符串下面的示例定义了若干字符串,并通过+或+=运算符对字符进行连接操作strings1=“ABCD*FG”;strings2=“Robot”;strings3=“Soccer”;strings4=s1+“HIJK”;//s4变为“ABCD*FGHIJK”s2+=s3;//s2变为“RobotSoccer”字符串的常用函数C++为字符串类型定义了若干函数,以方便的使用字符串常用的字符串函数与功能函数功能返回值length()/size()求字符串长度返回字符串长度,不包括‘\0’find(stringstr)查找子串返回找到的第一个子串的位置substr(intstart,intlength)取出子串返回子串erase(intstart,intlength)删除子串返回删除后的字符串insert(intpos,stringstr)插入子串返回插入后的字符串replace(intstart,intlength,intstr)替换子串返回替换后的字符串reverse(s.begin(),s.end())字符串翻转返回翻转后的子串14字符串的常用函数length()/size()函数用于统计字符串中存储的字符数,二者等价字符串变量.length()或者字符串变量.size()下面的示例定义并初始化了一个字符串变量,然后分别通过length和size函数获取字符串的长度string

str=“helloworld”;intlen1=str.length();//输出字符串长度:11(包含空格)cout<<len1;intlen2=str.size();//输出字符串长度:11(包含空格)cout<<len2;问题描述模拟实现字符串类型的length()/size()函数,计算输入的字符串长度(可以包含空格)。函数定义:intMyLength(stringsrcString)其中:SrcString:源字符串返回值:为获取到的字符串长度常规练习-模拟实现length/size函数输入格式一行字符串输出格式一个正整数输入样例helloworld输出样例11参考代码int

MyLength(stringstr){

inti=0,cnt=0;

while(str[i]!=‘\0’)

{ cnt++ i++;

}

returncnt;}常规练习-模拟实现length/size函数17ASCII码计算机中使用0-127的数字(总共128个),用来表示128个英文字符ASCII码ASCII码的作用一个char型字符可以用0-127之间的int型数据表示,也就是它的ASCII码值,二者可以互换字符可以方便的转成序号字符也可以用来进行算术运算大小写可以方便的转换,如字符‘a’可以转换为’A’数字字符与其表示的数字可以方便的转换,如字符‘9’可以转换为数字9ASCII码char型和int数据的互换下面的示例演示了值为65的整型变量a,可以输出为字符‘A’,相反的,字符’a’也可以输出为数字97,因为字符‘A’的ASCII码为65,字符’a’的ASCII为97inta=65;//定义整型变量acharb=‘a’;//定义字符型变量bcout

<<(char)a<<endl;//按字符方式输出整型变量acout<<(int)b;

//按数字方式输出字符型变量bASCII码数字字符与数字的转换首先需要理解:数字字符和实际的数字并不是一回事,比如字符‘0’只是表示一个数字字符,它和数字0是不同的两种数据类型。和字符

‘0’等价的数字是它的ASCII值48。从ASCII码表中可以看出:数字字符‘0’-‘9’的ASCII值是连续的,其范围是48-57。下面的代码演示了如何将一个数字字符转换为对应数字。intCharToInt(charch){

//直接用字符减去字符‘0’的ASCII值即可

returnch–‘0’;//或者returnch–48;}常规练习–职工编号校验问题描述某单位的职工编号共18位,由17位数字和一位校验码组成校验码按如下规则:将前面的17位数分别乘以不同的系数。从第1位到第17位的系数分别为:7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2将这17位数字和系数相乘的结果相加,用加出来的和除以11,看余数是多少余数只可能有0,1,2,3,4,5,6,7,8,9,10这11个数字,其分别对应的最后一位号码为1,0,X,9,8,7,6,5,4,3,2例如:如果余数是10,余数所对应的最后一位是2,则校验码为2要求:输入一个职工编号,验证其是否有效输入格式一行编号字符串,没有空格输出格式如校验码正确,则输出一行,为数字1;如果不正确,则输出两行,第一行为0,第二行为正确的校验码输入样例123456789012345672输出样例07常规练习–职工编号校验参考代码(1/2)charCodeCRC(stringcode){

intsum=0;

inta[17]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};

charcrc[11]={'1','0','X','9','8','7','6','5','4','3','2'};

for(inti=0;i<17;i++) sum+=

(code[i]-‘0’)*a[i];//累加和 sum%=11;

returncrc[sum];}校验函数常规练习–职工编号校验参考代码(2/2)intmain(){

stringcode;

cin

>>code;

charcrcCode=CodeCRC(code);

//调用校验函数计算校验码

if(crcCode==code[17])

cout

<<"1";

else

{

cout

<<"0"<<

endl

<<crcCode;

}

return0;}主函数常规练习–职工编号校验ASCII码大小写字符的判断如果字符的ASCII在65-90之间,则为大写字符,如果在97-122

之间,则为小写字符下面的代码演示了如何判断一个字符是否为大小写字符intIsUpperOrLower(charch){

if(ch>=65&&ch<=90)return1;

//大写

else

if(ch>=97&&ch<=122)return0;

//小写}ASCII码大小写字符的相互转换大写字符与对应的小写字符固定相差32将大写字符的ascii码+32即可得到对应的小写字符,相反,将小写字符的ascii码-32可得到对应的大写字符下面的代码演示了如何将一个大写字符转换为大小写字符intUpperToLower(charch){

returnch+32;

//大写转小写}ASCII码C++提供现成的函数对字符进行判断和转换功能islower(字符):判断给定的字符是否是小写字符isupper(字符):判断给定的字符是否是大写字符tolower(字符):将给定的字符转换为小写字符toupper(字符):将给定的字符转换为大写字符isalpha(字符):判断给定的字符是否为英文字母isdigit(字符):判断给定的字符是否为数字字符问题描述输入1个大小写混合的字符串,将其全部转换为大写字符并输出。输入格式一行字符串,大小写可混合,可含空格,可含数字字符输出格式一行字符串,全部为大写字符,空格和数字字符不转换,原样输出常规练习–字符串大小写转换输入样例HelloWorld123输出样例HELLOWORLD123常规练习–字符串大小写转换参考代码#include<stdio.h>#include<string.h>usingnamespacestd;intmain(){

stringstr; getline(cin,str);

str=StrToUpper(str);

cout<<str;};stringStrToUpper(stringstr){

for(inti=0;i<str.size();i++)

{

if(islower(str[i]) toupper(str[i]);

}

returnstr;}主函数StrToUpper函数常规练习–字符串大小写转换ASCII码利用ASCII码可以进行字符串大小的比较Air<

Boat:由于‘B’>‘A’所以Boat大(字典序在后)Air<An:

由于'n'>'i'所以An大Billy>Bill:由于'y'>''(空)所以Billy大Air<air:

由于‘a’>‘A’所以air大ASCII码可以直接使用关系运算符来比较C++字符串的大小关系运算符中的>、<、>=、<=、==、!=可以直接用来比较字符串

下面的示例演示了如何使用关系运算符对两个字符串进行比较intmain(){

strings1,s2;

cin

>>s1>>s2; if(s1>s2)cout

<<

“s1>s2”;

else

if(s1==s2)

cout

<<

“s1==s2”;

else

cout

<<

“s1<s2”;

return0;}常规练习–不使用比较运算符对字符串大小进行比较问题描述实现字符串大小比较函数StrCompare,对输入的两个字符串s1和s2比较其大小。输入格式输入两个字符串s1和s2,每个字符串占一行,长度不超过200且不含空格输出格式如果s1>s2的返回1;如果s1<s2的返回-1;如果s1==s2的返回0输入样例1输入样例2输入样例3

airboatairboatairair输出样例1输出样例2输出样例3-110常规练习–不使用比较运算符对字符串大小进行比较思路分别从两个字符串的第一个字符开始,一一比对,按照ASCII码值返回比较结果输入的两个字符串的长度不一定相等,最大的比较长度应该为较短的字符串长度参考代码intStrCompare(strings1,strings2){

intlen1=s1.length();

intlen2=s2.length();

intlen=(len1>len2)?len2:len1;

for(inti=0;i<len;i++)//按最短长度比较

{

if(s1[i]>s2[i])

return1;

//比较途中得到结果,提前返回

else

if(s1[i]<s2[i])

return-1;//比较途中得到结果,提前返回

}

//按最短长度比较结束,仍未得出结果,则谁长谁大

if(len1>len2)

return1;

else

if(len1<len2)

return-1;

else

return0;}常规练习–不使用比较运算符对字符串大小进行比较36字符串的常用函数find()函数返回给定字符串中第一次出现的索引,如果find()函数没找到,返回string::nposstring::npos在string.h中定义,为一个非零值,代表没未找到find函数区分大小写字符串变量.find(待查找字符串)下面的示例演示了从字符串str中分别查找两个子串,并返回不同的结果string

str=“helloworld”;intpos1=str.find(“world”);

//返回查找到的以0开始的下标位置:6intpos2=str.find(“World”);//因为区分大小写,此时将返回string::npos常规练习–使用find函数验证子串问题描述输入两个字符串s1和s2,其中一个串是否为另一个字符串的子串。输入格式输入两个字符串s1和s2,每个字符串占一行,长度不超过200且不含空格输出格式如果s2是s1的子串,输出(s2)issubstringof(s1),若s1是s2的子串,则输出(s1)issubstringof(s2),否则,输出“Nosubstring”,输入样例

dddncabcaabc输出样例abcissubstringofdddncabca参考代码intmain(){

strings1,s2;

intp1,p2;

cin

>>s1>>s2;p1=s1.find(s2);//s1中查s2p2=s2.find(s1);//s2中查s1

if(p1!=string::npos)

//s1中找到s2

cout<<s1<<

“issubstringof”<<s2;

elseif(p2!=string::npos)

//s2中找到s1

cout<<s2<<

“issubstringof”<<s1;

else

cout<<

“Nosubstring”

return0;}常规练习–使用find函数验证子串常规练习–模拟实现字符串的find函数问题描述输入两个字符串s1和s2,验证s2是否为s1的子串,并返回s2在s1中的开始位置。输入格式输入两个字符串s1和s2,每个字符串占一行,长度不超过200且不含空格输出格式如果在s1中能找到s2,返回s2在s1中的开始位置,否则返回string::npos输入样例1输入样例2dddncabcadddncabcaabcadc输出样例1输出样例25string::npos思路挪动字符串s2,对准字符串s1的各个

位置;逐一比对字符,判断是否相等s1:ababcabcs2:abc1、ababcabc|||abc2、ababcabc|||abc3、ababcabc|||abc常规练习–模拟实现字符串的find函数参考代码intMyStrFind(stringstr1,stringstr2){

intlen1=str1.length();

intlen2=str2.length();

for(inti=0;i<len1-len2;i++){j=0;

while((j<len2)

&&str1[i+j]==str2[j])

j++;//逐一比对

if(j==len2)

returni;//找到子串

}

returnstring::npos;//没有找到}常规练习–模拟实现字符串的find函数42字符串的常用函数substr()函数返回一个字符串的从指定位置开始的指定长度的子串字符串变量.substr(子串开始位置,子串长度)下面的示例演示了从字符串str中取出一个子串string

str1=“ABCD*FGHIJK”;string

str2=str1.substr(5,3);//str2是从str1中的下标位置5开始,取3个字符,所以结果为“FGH”常规练习–图书编码校验问题描述(1/2)每一本正式出版的图书都有一个图书编码与之对应,图书编码包括9位数字、1位识别码和3位分隔符,其规定格式如”x-xxx-xxxxx-x”,其中符号’-’是分隔符,最后一位是识别码,例如0-670-82162-4就是一个标准的图书编码。图书编码的首位数字表示书籍的出版语言;第一个分隔符”-”之后的三位数字代表出版社;第二个分隔符之后的五位数字代表该书在出版社的编号;最后一位为识别码。识别码生成规则为:首位数字乘以1加上次位数字乘以2……以此类推,用所得的结果mod11,所得的余数即为识别码,如果余数为10,则识别码为大写字母X。例如编码0-670-82162-4中的识别码4是这样得到的:对”067082162”这9个数字,从左至右,分别乘以1,2,……,9,再求和,即0×1+6×2+……+2×9=158,然后取158mod11的结果4作为识别码。问题描述(2/2)任务是编写程序判断输入的编码中识别码是否正确,如果正确,则仅输出“Right”;如果错误,则输出你认为是正确的编码。输入格式只有一行,是一个字符序列,表示一本书的编码(保证输入符合编码的格式要求)输出格式共一行,假如输入的识别码正确,那么输出“Right”,否则,按照规定的格式,输出正确的编码(包括分隔符“-”)常规练习–图书编码校验输入样例10-670-82162-4输出样例1Right输入样例20-670-82162-0输出样例20-670-82162-4常规练习–图书编码校验参考代码(1/2)charIsbnCRC(stringisbn){

stringstr=isbn.substr(0,1)+isbn.substr(2,3)+isbn.substr(6,5);

intsum=0;

for(inti=0;i<9;i++) { sum=sum+(str[i]-'0')*(i+1); } sum=sum%11;

if(sum==10)return‘X’;

elsereturn(sum+‘0’);}常规练习–图书编码校验参考代码(2/2)intmain(){

stringisbn;

cin

>>isbn;

charcrc=IsbnCRC(isbn);

if(crc==isbn[12])

//获取校验码

cout

<<“Right”;//正确

elsecout

<<

(isbn.substr(0,12)+crc);//错误

return0;}常规练习–图书编码校验常规练习–模拟实现substr()函数问题描述模拟实现substr()函数,获取指定字符串的子串输入格式三行,第一行为完整字符串,不带空格,第二行为子串的开始位置,第三行为子串的长度输出格式一行字符串,从完整字符串中获取的子串常规练习–模拟实现substr()函数输入样例Helloworld53输出样例wor参考代码stringMySubstr(stringstr,intstart,intlen){stringrstr=“”;

for(inti=0;i<len;i++)

{rstr+=str[start+i];

}returnrstr;}50字符串的常用函数erase()函数从一个字符串中删除指定长度的字符串,并返回删除后的字符串字符串变量.erase(开始位置,删除长度)下面的示例演示了从字符串str中删除若干连续字符string

str=“ABCD*FGHIJK”;cout<<

str.erase(5,3);//从str中的下标位置5开始,删除3个字符,所以结果为“ABCD*IJK”常规练习–删除单词后缀问题描述给定一个单词,如果该单词以er、ly或者ing后缀结尾,则删除该后缀(题目保证删除后缀后的单词长度不为0),否则不进行任何操作。输入格式一行,包含一个单词(单词中间没有空格,每个单词最大长度为32)输出格式一行,如果有上述要求的后缀,则返回删除后缀后的单词;如果没有,则单词原样返回。输入样例输出样例refererrefer常规练习–删除单词后缀参考代码intmain(){stringword;

cin

>>word;

intlen=word.length();strings1=word.substr(len-2,2);//取后两位字符strings2=word.substr(len-3,3);//取后三位字符

if(s1==“er”||s1==“ly”)word.erase(len-2,2);

else

if(s2==“ing”)word.erase(len-3,3);

cout

<<word;return0;}53字符串的常用函数replace()函数返回字符串从pos位置起始的用str1串替换length长度字符后的字符串字符串变量.replace(pos,length,str1)下面的示例演示了从字符串str中用指定字符串替换掉若干字符string

str=“ABCD*FGHIJK”;cout<<

str.replace(5,2,”xyz”);//从str中的下标位置5开始,用“xyz”替换掉2个字符,所以结果为“ABCD*xyzHIJK”常规练习–单词替换问题描述输入一个字符串,以回车结束(字符串长度<=100)。该字符串由若干个单词组成,单词之间用一个空格隔开,所有单词区分大小写。现需要将其中的某个单词替换成另一个单词,并输出替换之后的字符串。输入格式输入包括三行,第一行是包含多个单词的字符串s;第二行是待替换的单词a(长度<=100);第三行是a将被替换的单词b(长度<=100)输出格式一行,将s中所有单词a替换成b之后的字符串。常规练习–单词替换输入样例YouwantsomeonetohelpYouYouHe输出样例HewantsomeonetohelpHe思路使用find()函数查找待替换单词,使用replace()函数进行替换常规练习–单词替换参考代码(1/2)stringWordReplace(stringstr,strings1,strings2){intp=str.find(s1);//查找第一个单词while(p!=string::npos){

str.replace(p,s1.length(),s2);//替换找到的单词

p=str.find(s1);//继续查找下一个}returnstr;}常规练习–单词替换参考代码(2/2)intmain(){

stringstr,s1,s2;getline(cin,str);

cin>>s1>>s2;str=WordReplace(str,s1,s2);cout<<str;returnstr;}58字符串的常用函数insert()函数从位置pos处插入字符串str,并返回插入后的字符串字符串变量.insert(pos,str)下面的示例演示了向字符串str中插入指定的字符串string

str=“ABCD*FGHIJK”;cout<<

str.insert(2,”xyz”);//从str中的下标位置2开始,插入字符串“xyz”,所以结果为“ABxyzCD*FGHIJK”常规练习–笨小猴的幸运单词问题描述笨小猴的词汇量很小,所以每次做英语选择题的时候都很头疼。但是他找到了一种方法,经试验证明,用这种方法去选择选项的时候选对的几率非常大。这种方法的具体描述如下:假设maxn是单词中出现次数最多的字母的出现次数,minn是单词中出现次数最少的字母的出现次数,如果maxn-minn是一个质数,那么笨小猴就认为这是个LuckyWord,这样的单词很可能就是正确的答案。输入格式只有一行,是一个单词,其中只可能出现小写字母,并且长度小于100常规练习–笨小猴的幸运单词输出格式共两行,第一行是一个字符串,假设输入的的单词是LuckyWord,那么输出“LuckyWord”,否则输出“NoAnswer”;第二行是一个整数,如果输入单词是LuckyWord,输出maxn-minn的值,否则输出0。输入样例1输入样例2errorolympic输出样例1输出样例2LuckyWordNoAnswer20参考代码(1/2)intLuckyWord(stringword){

inta[26]={0};//每个字符有一个计数器

for(inti=0;i<word.size();i++) a[word[i]-97]++;//按字符计数

intmax=a[0];

for(inti=0;i<26;i++)

if(max<a[i])max=a[i];//查找最多字符数

intmin=max;

for(inti=0;i<26;i++)

//查找最少字符数

if(a[i]>0&&min>a[i])min=a[i];

returnmax-min;//返回最多最少数差}常规练习–笨小猴的幸运单词参考代码(2/2)常规练习–笨小猴的幸运单词intmain(){

stringstr;

cin>>str;

inta=LuckyWord(str);//计算差值a=PrimeNumber(a);//质数判断

if(a==1)

cout

<<“LuckyWord”<<endl<<a;

else

cout

<<“NoAnswer”<<endl<<“0”;returnstr;}intPrimeNumber(inta)//质数判断{

if(a==0)

return0;

for(inti=2;i<=a-1;i++) {

if(a%i==0)

return0;//非质数 }

return1;//质数}提高练习–单词统计问题描述给出一个单词(长度不超过10)给出一段文本(长度不超过1000)END_OF_TEXT结束,可以换行求单词在该文本中的次数(区分大小写)输入格式至少三行,第一行为要统计的单词,最后一行为结束标志END_OF_TEXT输出格式一行,为统计出的单词个数输入样例computer

Nurturescomputerscientistsandhighly-skilledcomputerengineerswhowillcreateandexploit"knowledge"forthenewera.Providesanoutstandingcomputerenvironment.END_OF_TEXT输出样例3提高练习–单词统计参考代码提高练习–单词统计intmain(){intcnt=0;strings,word;

cin

>>word;cin>>s;while(s!=“END_OF_TEXT”){if(s==word)cnt++;

cin

>>s;

}

return0;}提高练习–高精度加法计算问题描述在编程进行数值计算时,有时会遇到运算的精度非常高,远远超过各种数据类型所表示的精度范围,有时数据又特别大,远远超过各种数据类型的极限值。要求输入两个超大的数据,计算两数之和。输入格式两行,每行均为一个全部由数字字符组成的字符串,不限长度输出格式一行,为两个数字字符串相加的和值,以数字字符串的形式输出提高练习–高精度加法计算思路模拟数字相加的过程,从两数字字符串的最右侧开始,一一相加,组装结果两串输入不一定谁长谁短,计算前调整一下,固定使串1短串2长或串2短串1长,以使计算更方便参考代码stringStrAdd(stringadd1,stringadd2){

if(add1.size()>add2.size())//看看谁短谁在前面补0

for(inti=0;i<add1.size()-add2.size();i++) add2='0’+add2;

else

for(inti=0;i<add2.size()-add1.size();i++) add1='0'+add1;

intb=0;//进位

stringres;//结果存放

for(inti=add1.size()-1;i>=0;i--)

{

inta=(add1[i]-‘0’)+(add2[i]-‘0’)+b;//计算当前位置 b=a/10;//进位值 a=a%10;//当前位置的结果值 res=(char)(a+‘0’)+res;//组装结果

}

if(b==1)res=‘1’+res;//最高位可能仍有进位

returnres;}提高练习–高精度加法计算intmain(){

stringa,b;

cin>>a>>b;

cout<<StrAdd(a,b);

return0;}提高练习–高精度减法计算问题描述在编程进行数值计算时,有时会遇到运算的精度非常高,远远超过各种数据类型所表示的精度范围,有时数据又特别大,远远超过各种数据类型的极限值。要求输入两个超大的数据,计算两数之差。输入格式两行,第一行为被减数,第二行为减数,必须全部为数字字符,不限长度输出格式一行,为两个数字字符串相减的差值,以数字字符串的形式输出提高练习–高精度减法计算思路模拟数字相减的过程,从两数字字符串的最右侧开始,一一相减,组装结果存在被减数小于减数的情况,为减少编程复杂度,可以先固定调整为串1大串2小,最后根据调整情况决定是否将结果加负号最终结果可能存在前面有若干个0的情况,要全部去掉参考代码(1/2)stringStrSubt(strings1,strings2){

stringresult;

intexch=0,b=0,a;//exch:是否已做交换b:借位标志

if(s1.length()<s2.length()||//1短2长

(s1.length()==s2.length()&&s1<s2)){//等长1小2大stringtemp=s1;s1=s2;s2=temp;//交换,保证1大2小exch=1;//交换标志,说明1小2大,结果应为负

}

intd=s1.size()–s2.size();//长度差用来计算错位

for(inti=s1.size()-1;i>=0;i--) { a=s1[i]-‘0’-b;//减借位的1

if(i-d>=0)a-=(s2[i-d]-‘0’);//还在短串范围内

if(a<0){b=1;a=a+10;}

//仍需借位

elseb=0; result=(char)(a+‘0’)+result;//组装结果

}//接下页……

提高练习–高精度减法计算intmain(){

stringa,b;

cin>>a>>b;

cout<<StrSubt(a,b);

return0;}参考代码(2/2)//接上页stringStrSubt(strings1,strings2)//可能存在前导0,去掉

intk;

for(k=0;k<result.size();k++)

{

if(result[k]!='0')

break; } result=result.substr(k,result.size()-k);

if(exch==1)result=“-”+result;//存在交换,结果为负

returnresult;}提高练习–高精度减法计算提高练习–高精度乘法计算问题描述在编程进行数值计算时,有时会遇到运算的精度非常高,远远超过各种数据类型所表示的精度范围,有时数据又特别大,远远超过各种数据类型的极限值。要求输入两个超大的数据,计算两数之乘积。输入格式两行,第一行为被乘数,第二行为乘数,必须全部为数字字符,不限长度输出格式一行,为两个数字字符串相乘的积,以数字字符串的形式输出思路模拟数字相乘的过程,从两数字字符串的最右侧开始,一一相乘,组装结果为方便编程,可以先固定调整为串1长串2短提高练习–高精度乘法计算参考代码intmain(){

stringa,b;

cin>>a>>b;

cout<<StrPlus(a,b);

return0;}提高练习–高精度乘法计算stringStrPlu

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论