牛客练习赛109-A-运算符号

文章介绍了在解决编程竞赛问题时遇到的取模运算知识点,包括取模与求余的区别,以及如何使用快速读入输出模板提高代码效率。题目要求找到使正整数n变零的最小代价,通过分析偶数和奇数的情况得出解题策略。

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

链接:https://ac.nowcoder.com/acm/contest/51721/A?&headNav=acm

来源:牛客网

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

inline int read(){
    int x=0,f=1;
    char c=getchar();
    while(c<'0'||c>'9'){
        if(c=='-')f=-1;
        c=getchar();
    }
    while(c<='9'&&c>='0'){
        x=(x<<1)+(x<<3)+(c^48);
        c=getchar();
    }
    return x*f;
}

void print(int x){
    if(x<0)putchar('-'),x=-x;
    if(x>9)print(x/10);
    putchar(x%10^48);
}

int a,b;

int main(){
    a=read(),b=read();
    print(a+b);
    return 0;
}

在这道题中,我get到了一个快速读入输出模板 遇到了一个以前没有特别在意的知识点 取模运算 ,现在正好补上了。


取模运算

提到取模运算,就不得不说取余运算。这两个东西,既有重叠的部分,又有所不同。这个点呢,百度说的很详细。取模运算_百度百科 (baidu.com)

想要求这两个东西呢,首先有两个公式

  1. 求整数商:c=a/b

  1. 求模(余数):r=a-c*b

举个栗子:

  1. 计算:-7mod4

因此a=-7, b=4

第一步:求整数商c

求模运算:c=a / b=(-7) / 4 =-2 [向负无穷方向舍入]

求余计算:c=a / b=(-7) / 4 =-1 [向0方向舍入]

第二步:求计算模和余数的公式相同,a,b的正负号不同,c的值也不同

求模运算:r=a - c * b=-7 - (-2)*4=1

求余计算:r=a - c * b=-7 - (-1)*4=-3

  1. 计算:7mod4

因此a=7, b=4

第一步:求整数商c

求模运算:c=a / b=7 / 4 =1

求余计算:c=a / b=7 / 4 =1

第二步:求计算模和余数的公式相同,a,b的正负号,c的值也相同

求模运算:r=a - c * b=7 - 1*4=3

求余计算:r=a - c * b=7 - 1*4=3

由此可以归纳出,

当a和b正负一致时,求模运算和求余运算所得c的值相同,所以结果相同。

当a和b正负不一致时,结果不同。


回到题目,它给出了几个样例

由题目

会有t组数据,每组数据有一个数n,我们需要把这个数变成0.

有两种可以让n变成0的操作可以选择

第一种:n-x

第二种:n mod x (n与x取模)

而这个x,就是要我们求的最小的总代价。

分析一下,

如果说 n是一个偶数,想要让它变成0,只需要与2取余即可,因此偶数的话,x=2。但是如果是最小偶数0的话,它直接就是0,所以直接x=0就好。

若n为奇数,最快的操作就是,先选择第一种,x先取1,让n变成偶数,再让它与2取余,使它变成0。因此,若为奇数时,x应该等于1+2=3 。但是如果是最小奇数1的话,它只需要减1就好了。

*注:题中所给的均为正数,因此,在此题中,取余跟取模的结果一样。

代码如下(运用了快速读入输出模板)

#include <iostream>
using namespace std;
 
inline int read(){
    int x=0,f=1;
    char c=getchar();
    while(c<'0'||c>'9'){
        if(c=='-')f=-1;
        c=getchar();
    }
    while(c<='9'&&c>='0'){
        x=(x<<1)+(x<<3)+(c^48);
        c=getchar();
    }
    return x*f;
}
 
void print(int x){
    if(x<0)putchar('-'),x=-x;
    if(x>9)print(x/10);
    putchar(x%10^48);
}
 
int main(){
    int t;
    t=read();
    long long n;
    while(t--)
    {
        n=read();
        if(n==0)
            print(0);
        else if(n==1)
            print(1);
        else if(n%2==0)
            print(2);
        else
            print(3);
        printf("\n");
    }
    return 0;
}

代码如下

#include<stdio.h>
int main()
{
    long t;
    scanf("%ld",&t);
    while(t--)
    {
        long long n,x;
        scanf("%lld",&n);
        if(n==0)
            x=0;
        else if(n==1)
            x=1;
        else if(n%2==0)
            x=2;
        else
            x=3;
        printf("%lld\n",x);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值