问题描述:
在计算机中,由于处理器位宽限制,只能处理有限精度的十进制整数加减法,比如在32位宽处理器计算机中,
参与运算的操作数和结果必须在-231~231-1之间。如果需要进行更大范围的十进制整数加法,需要使用特殊
的方式实现,比如使用字符串保存操作数和结果,采取逐位运算的方式。如下:
9876543210 + 1234567890 = ?
让字符串 num1="9876543210",字符串 num2="1234567890",结果保存在字符串 result = "11111111100"。
-9876543210 + (-1234567890) = ?
让字符串 num1="-9876543210",字符串 num2="-1234567890",结果保存在字符串 result = "-11111111100"。
要求编程实现上述高精度的十进制加法。
要求实现函数:
void add (const char *num1, const char *num2, char *result)
【输入】num1:字符串形式操作数1,如果操作数为负,则num1[0]为符号位'-'
num2:字符串形式操作数2,如果操作数为负,则num2[0]为符号位'-'
【输出】result:保存加法计算结果字符串,如果结果为负,则result[0]为符号位。
注:
I、 当输入为正数时,'+'不会出现在输入字符串中;当输入为负数时,'-'会出现在输入字符串中,且一定在输入字符串最左边位置;
II、 输入字符串所有位均代表有效数字,即不存在由'0'开始的输入字符串,比如"0012", "-0012"不会出现;
III、 要求输出字符串所有位均为有效数字,结果为正或0时'+'不出现在输出字符串,结果为负时输出字符串最左边位置为'-'。
#include
#include
using namespace std;
int compare(string &num1,string &num2);
string &add(string &num1,string &num2,string &result);
string &minu(string &num1,string &num2,string &result);
int main()
{
string num1,num2,result,temp;
while(cin>>num1>>num2) {
if(num1[0]=='-'&&num2[0]=='-') {
num1.erase(0,1);
num2.erase(0,1);
result.push_back('-');
add(num1,num2,result);
}
else if((num1[0]!='-'&&num2[0]=='-')||(num1[0]=='-'&&num2[0]!='-')) {
if(num2[0]=='-')
num2.erase(0,1);
else
num1.erase(0,1);
int m=compare(num1,num2);
if(m==0){
result.push_back('-');
minu(num2,num1,result);
}
else if(m==1)
minu(num1,num2,result);
else
result.push_back('0');
}
else
add(num1,num2,result);
cout<num2.size())
return 1;
else
{
for(int i=0;inum2[i])
return 1;
}
return 3;
}
}
string &add(string &num1,string &num2,string &result)
{
string temp;
int m1=num1.size();
int m2=num2.size();
int m=m1>=m2?m2:m1;
int flag=0,num;
for(int i=0;i=10) {
flag=1;
temp.push_back(num%10+'0');
}
else {
temp.push_back(num+'0');
flag=0;
}
}
if(m1>m2) {
for(int i=m1-1-m;i>=0;i--) {
num=(num1[i]+'0')+flag;
if(num>=10) {
flag=1;
temp.push_back(num%10+'0');
}
else {
temp.push_back(num+'0');
flag=0;
}
}
}
else if(m1==m2) {
if(flag==1)
temp.push_back('1');
}
else {
for(int i=m2-1-m;i>=0;i--) {
num=(num2[i]+'0')+flag;
if(num>=10) {
flag=1;
temp.push_back(num%10+'0');
}
else {
temp.push_back(num+'0');
flag=0;
}
}
}
int n=temp.size();
char c;
for(int i=0;im2)
{
for(int i=m1-1-m2;i>=0;i--)
{
num=(num1[i]-'0')-flag;
if(num<0)
{
temp.push_back(num+10+'0');
flag=1;
}
else
{
temp.push_back(num+'0');
flag=0;
}
}
}
int n=temp.size();
char c;
for(int i=0;i
Word Maze 是一个网络小游戏,你需要找到以字母标注的食物,但要求以给定单词字母的顺序吃掉。如上图,假设给定单词if,你必须先吃掉i然后才能吃掉f。 但现在你的任务可没有这么简单,你现在处于一个(n×m的矩阵)当中,里面到处都是以字母标注的食物,但你只能吃掉能连成给定单词W的食物。 如下图,指定W为“SOLO”,则在地图中红色标注了单词“SOLO”。 注意区分英文字母大小写,你只能上下左右行走。
运行时间限制: 无限制
内存限制: 无限制
输入:
输入第一行包含两个整数n、m(0
输出:
如果能在地图中连成给定的单词,则输出“YES”,否则输出“NO”。注意:每个字母只能用一次。
样例输入:
5 5
SOLO
CPUCY
EKLQH
CRSOL
EKLQO
PGRBC
样例输出:yes
#include
#include
#include
using namespace std;
void search(char **p,bool **visit,const string &w,int pos,int n,int m,int s,int e);
int main()
{
int n,m,pos=0;
cin>>n>>m;
string w;
cin>>w;
char **p=new char*[n];
bool **visit=new bool*[n];
for(int i=0;i>p[i][j];
visit[i][j]=false;
}
for(int i=0;i=0&&visit[s-1][e]==false&&p[s-1][e]==w[pos])
{
visit[s-1][e]=true;
search(p,visit,w,pos+1,n,m,s-1,e);
}
if(e-1>=0&&visit[s][e-1]==false&&p[s][e-1]==w[pos])
{
visit[s][e-1]=true;
search(p,visit,w,pos+1,n,m,s,e-1);
}
if(s+1
将 电话号码 one two 。。。nine zero
翻译成1 2 。。9 0
中间会有double
例如输入:OneTwoThree
输出:123
输入:OneTwoDoubleTwo
输出:1222
输入:1Two2 输出:ERROR
输入:DoubleDoubleTwo 输出:ERROR
第三题:有空格,非法字符,两个Double相连,Double位于最后一个单词 都错误
#include
#include
有一个宾馆,只有m个房间(room),有房客(A~Z)到来时,若有空房间则可以立即入住;没有空房间则不能入住,旅客可以选择立即离开或者等待空房间;
假设给定了各个旅客到达和离开的顺序(如HFBJJBKFHMMSSLPWWPLK),问有多少个旅客没能入住。
要求:
输入:房间数 旅客到达离开的序列
输出:最终没能入住的旅客数
输入:3 HFBJJBKFHMMSSLPWWPLK
输出:2
#include
#include
#include
#include
using namespace std;
vector arraylist;
bool isInRoom(vector arraylist,char user)
{
bool temp=false;
for(int i=0;i>num;
cin>>users;
int result=0;
for(int i=0;i::iterator iter = find(arraylist.begin(),arraylist.end(),users[i]);
arraylist.erase(iter);
}
else if(arraylist.size()::iterator iter = arraylist.end();
arraylist.insert(iter,users[i]);
}
else {
result++;
continue;
}
}
cout<