c++笔试题准备

1.两个任意长度的正数相减,这两个正数可以带小数点,也可以是整数,请输出结果。输入的字符串中,不会出现除了数字与小数点以外的其它字符,不会出现多个小数点以及小数点在第一个字符的位置等非法情况,所以考生的程序中无须考虑输入的数值字符串非法的情况。

详细要求以及约束:

1.输入均为正数,但输出可能为负数;
2.输入输出均为字符串形式;
3.如果输出是正数则不需要带符号,如果为负数,则输出的结果字符串需要带负号
例如:2.2-1.1直接输出为“1.1”,1.1-2.2 则需要输出为“-1.1”
4.输出的结果字符串需要过滤掉整数位前以及小数位后无效的0,小数位为全0的,直接输出整数位
例如相减结果为11.345,此数值前后均不可以带0,“011.345”或者“0011.34500”等等前后带无效0的均视为错误输出。例如1.1-1.1结果为0.0,则直接输出0。

要求实现函数:

void Decrease(char input1, charinput2, char *output)
【输入】char *input1 被减数
char *input2 减数
【输出】char *output 减法结果
【返回】无

#include <iostream>
using namespace std;

void Decrease(char *input1, char*input2, char *output)
{
int i;
int n1=0;
int n2=0;
int m1=0;
int m2=0;
for(i=0;input1[i]!='.';i++)
{
if(input1[i]=='\0')
{
m1=-1;
break;
}
++n1;
}
if(m1==-1)
m1=0;
else
{
for(++i;input1[i]!='\0';i++)
{
++m1;
}
}

for(i=0;input2[i]!='.';i++)
{
if(input2[i]=='\0')
{
m2=-1;
break;
}
++n2;
}

if(m2==-1)
m2=0;
else
{
for(++i;input2[i]!='\0';i++)
{
++m2;
}
}

cout<<"n1="<<n1<<" "<<"n2="<<n2<<endl;
cout<<"m1="<<m1<<" "<<"m2="<<m2<<endl;

int m3=(m1>m2?m1:m2);
int n3=(n1>n2?n1:n2);
int len=n3+m3;
char *s1=new char[len];
char *s2=new char[len];
char *s3=new char[len+1];
for(i=0;i<n3;i++)
{
if(n3-i>n1)
s1[i]='0';
else
s1[i]=input1[n1+i-n3];
if(n3-i>n2)
s2[i]='0';
else
s2[i]=input2[n2+i-n3];
}

for(i=n3;i<m3+n3;i++)
{
if(i-n3<m1)
s1[i]=input1[n1+1+i-n3];
else
s1[i]='0';
if(i-n3<m2)
s2[i]=input2[n2+1+i-n3];
else
s2[i]='0';
}

s1[i]='\0';
s2[i]='\0';

cout<<s1<<endl;
cout<<s2<<endl;

int k=0;

for(i=0;i<len;i++)
{
if(s1[i]>s2[i])
break;
else if(s1[i]<s2[i])
{
k=-1;
break;
}
}

int d=0;


if(k==-1)
{
for(i=0;i<len;i++)
{
swap(s1[i],s2[i]);
}
output[d++]='-';
}

cout<<s1<<endl;
cout<<s2<<endl;

k=0;
for(i=len-1;i>-1;i--)
{
if((k+s1[i]-s2[i])>=0)
{
s3[i]='0'+k+s1[i]-s2[i];
k=0;
}
else
{
s3[i]='0'+10+k+s1[i]-s2[i];
k=-1;
}
cout<<"s3[]"<<i<<""<<s3[i]<<endl;
}

s3[len]='\0';
cout<<s3<<endl;

int start=0;
for(i=0;i<n3;i++)
{
if(start==0 && s3[i]=='0')
continue;
start=1;

output[d++]=s3[i];
}
if(start==0)
output[d++]='0';

start=0;


for(i=len-1;i>n3-1;i--)
{
if(start==0&&s3[i]=='0')
continue;
start=1;
break;
}


int a1=i;

if(start==0)
{
output[d]='\0';
}
else
{
output[d++]='.';
for(i=n3;i<a1+1;i++)
output[d++]=s3[i];
output[d]='\0';
}

}


int main()
{
char *input1="11.1" ;
char *input2="112.2";
char *output=new char[100];
Decrease(input1, input2, output);
cout<<output<<endl;

return 0;
}```


2.在给定字符串中找出单词( “单词”由大写字母和小写字母字符构成,其他非字母字符视为单词的间隔,如空格、问号、数字等等;另外单个字母不算单词);找到单词后,按照长度进行降序排序,(排序时如果长度相同,则按出现的顺序进行排列),然后输出到一个新的字符串中;如果某个单词重复出现多次,则只输出一次;如果整个输入的字符串中没有找到单词,请输出空串。输出的单词之间使用一个“空格”隔开,最后一个单词后不加空格。
#### 思路:
拷贝输入的字符串,然后搜索整个字符串,非字母(不满足要求的,包括单个字母)的字符变成'\0',并且记录每个单词首字母的位置和每个单词的长度,再然后,利用二重指针,把每个单词的首地址记录下来

#include
#include
using namespace std;
void choose(char *str,int len,char *outstr);
int main()
{
char str[20];
gets(str);
int len=strlen(str);
char outstr[100];
choose(str,len,outstr);
cout<<outstr<<endl;
system(“pause”);
return 0;
}
void choose(char *str,int len,char *outstr)
{
int count=0,r_len[100],j=0,k=0,linshi=0,word_count=0;
char temp[100],*linshi2;
strcpy(temp,str);
for(int i=0;i<=len;i++)//易犯错,注意这里需要用<=号,否则可能无法进入else导致出现问题
{
if((temp[i]>=‘a’ && temp[i]<=‘z’)||(temp[i]>=‘A’ && temp[i]<=‘Z’))
count++;
else
{
if(count==1)
temp[i-1]=’\0’;
if(count>=2)
r_len[j++]=count;
count=0;
temp[i]=’\0’;
}
}

word_count=j;
count=0;
char **a=(char **)malloc(sizeof(char *)*len);
for(int i=0;i<len;i++)
{
if((temp[i]>=‘a’ && temp[i]<=‘z’)||(temp[i]>=‘A’ && temp[i]<=‘Z’))
{
count++;
if(count==1)
{
a[k++]=&temp[i];
}
}
else
{
count=0;
}
}
//排序
for (int m=0;m<word_count-1;m++)
{
for(int n=word_count-1;n>m;n–)
{
if(r_len[n] < r_len[n-1])
{
//这里一起排序
linshi=r_len[n];
r_len[n]=r_len[n-1];
r_len[n-1]=linshi;

linshi2=a[n];
a[n]=a[n-1];
a[n-1]=linshi2;
}
}
}
for(int i=0;i<word_count;i++)
{
cout<<a[i]<<" ";
}
cout<<endl;
cout<<endl;
outstr[0]=’\0’;//注意,易错,outstr指向一块未赋值的空间,不先赋值’\0’,就使用strcat会出问题,会在原有的乱码后拼接,赋值’\0’后从这里开始拼接
for(int i=0;i<word_count;i++)
{
strcat(outstr, a[i]);
int k=strlen(outstr);
outstr[k]=’ ‘;
outstr[k+1]=’\0’;
}
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值