p1957口算题c语言,洛谷P1957口算练习题题解

博主在解决一道模拟题时,遇到输入字符转数字的难题。尝试了getline和逐字符读取,最终通过字符串拼接和函数化编程解决了问题。关键教训包括函数化编程的重要性及细节处理防止溢出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言:

正文开始:

_话说 ,就当本蒟蒻正高高兴兴的刷水题时,居然

碰到了这个laji题_

于是就开始了一顿乱写:

思路部分:

这道题很大的一个痛点就在于输入

4

a 64 46

275 125 //这里咋就没有字母了呢????

c 11 99

b 46 64

看来,三个cin不行

于是,经过几分钟的思考,

我大致确定了两种方案:

1.直接getline一行:

可是.....这个如何转换为数字的问题吗,还是去问前排一波的Ak大佬吧(逃)

2.其他办法:

先cin一个char类型的呗,至于那种毒瘤情况待会再解决

于是代码:

cin>>y;

if(y>='a'&&y<='c'){

w=y;

cin>>s1;

}

cin>>s2;

补充小知识:char可是只会读入一个的oh

于是当275 125 这种数据出现的时候,y,s1,s2会变成这样:

y=‘2’;

s2=75;

s3=125;

好了,于是一种想法就理所应当的产生了:吧y变为数字,再与s2拼起来不就得了?

于是:

char y;long long s1,s2;

cin>>y>>s1>>s2;

s1=(y-'0')*pow(10,line(s1))+s1;

cout<

return 0;

其中有一句line(s1)是读取s1有几位的函数(当然要自己写啦)

long long line(long long i){

long long j=0,k=i;

if(i<=0){

k=-k;

j++;

}

while(k>0){

k=k/10;

j++;

}

return j;

}

很简单,一个模板而已;

可是,你难道没发现什么bug:当如测试点2的5002时会:变为52!!!!!!!

哪儿有问题呢?

原来,当程序读入5002时灰度为‘5’;002->2!!

所以,另辟新路吧!

仔细想想,原来可以这样!!

可把后面的s1用字符串读入

然后与y一拼,一起化为数字:

cin>>e;

e=y+e;

int le=e.size();int kw=1;int ss=0;

for(int i=le-1;i>=0;i--){

ss+=(kw*(e[i]-'0'));

kw=kw*10;

}

s1=ss;

于是,只需要再注意一些细节问题便好:

int main(){

long long n; cin>>n;

for(long long i=1;i<=n;++i){

getzf();

//cout<

if(w=='a'){

cout<

cout<

}

else if(w=='b'){

cout<

cout<

//cout<

}

else if(w=='c'){

cout<

cout<

}

}

return 0;

}

注意不要多输出换行oh!!!!!

那会爆零的!!!

code,完整代码:

#include

using namespace std;

string a,e; long long s1,s2;char w,y;//////////////////////iephyhoyhjyeohyohytuohyoihj/////iihjn

long long line(long long i){

long long j=0,k=i;

if(i<=0){

k=-k;

j++;

}

while(k>0){

k=k/10;

j++;

}

return j;

}

void getzf(){

cin>>y;

//cout<

if(y>='a'&&y<='c'){

w=y;

cin>>s1;

}

else{

cin>>e;

e=y+e;

int le=e.size();int kw=1;int ss=0;

for(int i=le-1;i>=0;i--){

ss+=(kw*(e[i]-'0'));

kw=kw*10;

}

s1=ss;

}

cin>>s2;

//cout<

}

int main(){

long long n; cin>>n;

for(long long i=1;i<=n;++i){

getzf();

//cout<

if(w=='a'){

cout<

cout<

}

else if(w=='b'){

cout<

cout<

//cout<

}

else if(w=='c'){

cout<

cout<

}

}

return 0;

}

了结!!

总结一下,下次做模拟题需注意:

1.函数化编程!!!!方便调试,方便理解

这才是做较难模拟题的王道!!!!

2.注意细节,避免爆零!!!

极简:将复杂的东西分为小块,像搭积木一样解决各类难题,这也是每个学科创造的大致路径

删繁就简三秋树,标新立异二月花

byebye~~~~!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值