C/C++ 数据处理问题,+-*/%,overflow,运行超时等。

本文讨论了C/C++中数据处理的一些常见问题和巧妙解决办法,包括取模运算的性质、避免溢出的平均数计算、不使用变量交换两个整数、判断整数是否为平方以及不使用特定运算符进行除法和加法运算。通过举例和分享LeetCode题目,深入探讨了这些问题的解决方案。
摘要由CSDN通过智能技术生成

取模运算

  • n % p得到结果的正负由被除数n决定,与p无关。

例如:7%4 = 3, -7%4 = -3, 7%-4 = 3, -7%-4 = -3。  

  • 常用的性质

    (a * b) % p = (a % p * b % p) % p

    (a + b) % p = (a % p + b % p) % p

更多相关性质参考
https://my.oschina.net/u/572632/blog/268778

求两个数的平均数

#include <cstdio> 
#include <cstdlib>
#include <cstring>
#include <string>
#include <vector> 
#include <algorithm> 
#include <iostream>

using namespace std;

const int MA = 0x7fffffff; // INT 最大 = 2147483647
const int MI = - MA - 1; // INT 最小 = - 2147483648

// 求平均数的函数
int avef(int a, int b)
{
    if ((a > 0 && b > 0) || (a < 0 && b <0)) // 同号时的处理
    {
        if (a > b){
            return b + (a - b) / 2;
        }
        else{
            return a + (b - a) / 2;
        }
    }
    return (a + b) / 2; // 异号时的处理
}

int main()
{
    int a = MA - 1;
    int b = MA - 3;
    int sumab = a + b; // -6 ;
    int c = (a + b) / 2;  // MA - 2  / -3 

    int ave;
    if (a > b){
        ave = b + (a - b) / 2;
    }
    else{
        ave = a + (b - a) / 2;
    }

    printf("%d\n%d\n%d\n", sumab, c, ave);

    printf("%d", avef(a, b));
    printf("%d", avef(a, b));
    return 0;
}

两个正数 或 两个负数相加 可能会溢出, 但是相减肯定不会溢出

ave = (a + b) / 2 = b + (a - b) / 2 = a + (b - a) / 2


不使用变量交换两个int变量

#

#include <cstdio> 
#include <cstdlib>
#include <cstring>
#include <string>
#include <vector> 
#include <algorithm> 
#include <iostream>

using namespace std;

const int MAX_INT = 0x7fffffff; // INT 最大 = 2147483647
const int MIN_INT = - MAX_INT - 1; // INT 最小 = - 2147483648

int main()
{
    int a = MAX_INT - 1;
    int b = MAX_INT - 3;

    // 不用新的变量 交换两个变量的值,虽然会溢出,但最后结果仍然正确
    a = a + b;
    b = a - b;
    a = a - b;

    printf("%d\n%d\n
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值