L1-025 正整数A+B(水题)+scanf(“%[^ ]“)的应用

这篇博客讨论了如何使用C++处理不规范的输入,包括使用scanf的`%[^ ]`格式来读取带有空格的字符串,并确保正确读取两个正整数A和B的和。当输入不符合正整数要求时,输出相应错误标记。示例代码展示了如何检查输入的有效性并限制数值范围。

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

L1-025 正整数A+B(水题)+scanf(“%[^ ]”)的应用

知识点:

用scanf输入带有空格的字符串

“%[]”格式可以用 ^+任意字符来结束字符串的输入

#include <bits/stdc++.h>
using namespace std;

int main(){
    char str[100];
    scanf("%[^\n]",str);
    //直到读入回车键,读取才结束
    //(可以有效替代gets,解决gets无法编译通过的问题)
    printf("%s\n",str);
}

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

getchar()是在输入缓冲区顺序读入一个字符(包括空格、回车和Tab)

按题目要求,两个字符串之间以一个空格想隔开,所以用getchar()把该空格从输入缓冲区读走,从而不影响第二个字符串

蒟蒻自己:

校内团队赛选拔的时候这个死活只过了三个测试点,怎么改都没过,后面发现自己想多了,记录一下自己的傻x时刻

题面

题的目标很简单,就是求两个正整数AB的和,其中AB都在区间[1,1000]。稍微有点麻烦的是,输入并不保证是两个正整数。

输入格式:

输入在一行给出AB,其间以空格分开。问题是AB不一定是满足要求的正整数,有时候可能是超出范围的数字、负数、带小数点的实数、甚至是一堆乱码。

注意:我们把输入中出现的第1个空格认为是AB的分隔。题目保证至少存在一个空格,并且B不是一个空字符串。

输出格式:

如果输入的确是两个正整数,则按格式A + B = 和输出。如果某个输入不合要求,则在相应位置输出?,显然此时和也是?

输入样例1:

123 456

输出样例1:

123 + 456 = 579

输入样例2:

22. 18

输出样例2:

? + 18 = ?

输入样例3:

-100 blabla bla...33

输出样例3:

? + ? = ?

代码

注意:

123 3 4这种情况输出结果仍为123 + ? = ?

哪怕都为正整数,也要注意范围(1<=x<=1000)

#include <bits/stdc++.h>
using namespace std;

int main(){
    char s1[1000],s2[1000];
    int sum1=0,sum2=0;
    int len1,len2;
    bool flag1=true,flag2=true;
    scanf("%s",s1);
    len1 = strlen(s1);
    for(int i=0;i<len1;++i){
        if(s1[i]>'9'||s1[i]<'0')
            flag1=false;
    }
    if(flag1){
        for(int i=0;i<len1;++i){
            sum1 = sum1*10+s1[i]-'0';
        }
    }
    getchar();
    //从输入缓冲区中把题目要求的空格给读取走
    //减免判断s2[0]是否为空格的操作。
    scanf("%[^\n]",s2);
    len2 = strlen(s2);
    for(int i=0;i<len2;++i){
        if(s2[i]>'9'||s2[i]<'0')
            flag2=false;
    }
    if(flag2){
        for(int i=0;i<len2;++i){
            sum2 = sum2*10+s2[i]-'0';
        }
    }
    if(flag1&&sum1>=1&&sum1<=1000)
        cout<<sum1<<" + ";
    else
        cout<<"? + ";
    if(flag2&&sum2>=1&&sum2<=1000)
        cout<<sum2<<" = ";
    else
        cout<<"? = ";
    if(flag1&&sum1>=1&&sum1<=1000 && flag2&&sum2>=1&&sum2<=1000)
        cout<<sum1+sum2;
    else
        cout<<"?";
}
### C语言 L1-035 情人节 编程解析 情人节是一个经典的编程练习,旨在通过给定的情侣编号来判断情侣是否在一起。对于这个问,输入是一系列情侣的编号对以及查询请求,输出则是根据这些请求返回的结果。 #### 输入描述 程序接收多组测试数据。每组测试数据的第一行为两个整数N (0<N≤50,000),表示有N对情侣;M(0<M≤10,000),表示要处理的关系询问数量。随后的一行包含2×N个正整数,代表按照顺序给出的所有人的ID号,其中第一个人和第二个人组成一对情侣,以此类推。最后M行中的每一行都含有两个人的名字(即他们的ID),用于询问这两人是不是情侣关系[^1]。 #### 输出要求 针对每一个询问,在单独的一行上打印"Yes"如果他们是情侣,否则打印"No"[^1]。 #### 实现思路 为了高效地解决此问,可以采用哈希表存储每对情侣的信息。当接收到查询时,只需检查这两个ID是否存在于同一个键值下即可快速得出结论。 下面是具体的实现方法: ```c #include <stdio.h> #define MAX_N 50000 * 2 + 10 // 考虑到数组越界的情况预留一些空间 int main() { int N, M; scanf("%d %d", &N, &M); int id[MAX_N]; for(int i = 0; i < 2*N; ++i){ scanf("%d", &id[i]); } while(M--){ int a,b; scanf("%d%d",&a,&b); char flag='N'; for(int j=0;j<2*N;j+=2){ if((id[j]==a && id[j+1]==b)||(id[j]==b&&id[j+1]==a)){ flag='Y';break; } } printf("%s\n",(flag=='Y')?"Yes":"No"); } return 0; } ``` 上述代码实现了读取输入并构建情侣映射的功能,并能够响应关于任意两个人之间是否存在情侣关系的查询请求。该算法的时间复杂度主要取决于内层循环遍历寻找匹配的过程,但在实际应用中表现良好,因为通常情况下情侣的数量远小于最大限制[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值