【基础循环算法】问题 AR: 门牌号 一天,班里的同学润润邀请宣宣到家里去玩,润润的家位于胡家胡同。

问题 AR: 门牌号

时间限制: 2.000 Sec  内存限制: 128 MB

题目描述

一天,班里的同学润润邀请宣宣到家里去玩,润润的家位于胡家胡同。这条胡同的门牌号是从1开始顺序编号,润润说:“其余各家的门牌号之和减去我家的门牌号,恰好等于n。”
告诉你n,请你帮宣宣计算一下:润润家的门牌号以及这个胡同里总共至少有多少户人家。

输入

输入共一行,一个正整数 n。输入数据保证有解。

输出

输出共一行,包含两个正整数,分别是润润家的门牌号及总共至少有多少家,中间用一个空格隔开。 

样例输入 Copy

100

样例输出 Copy

10 15

提示

共15家,润润家的门牌号是10,其余家的门牌号之和是110,110-10=100。

对于40%的数据:最大门牌号不超过1000;
对于70%的数据:最大门牌号不超过10000;
对于100%的数据:最大门牌号不超过40000,n<2000000000。

分析及AC代码

/**
 * Created py Liu Xianmeng On 2022/12/29
 */
#include <bits/stdc++.h>
using namespace std;
int main() {
    int cnt = 0;
    int sub_sum;
    scanf("%d", &sub_sum);
    int cur_sum = 0;
    while(true){
        ++cnt;
        cur_sum += cnt;
        if(cur_sum>sub_sum){
            int sub = cur_sum - sub_sum;
            // 因为题目问的是至少有多少户人家 所以一旦有一个cnt满足条件 打印出第一个程序即结束
            // 因为后面满足条件的cnt(人家数)只会越来越大 而题目问的是至少有多少户人家 所以只需要打印出最小的符合条件的cnt即可
            if(sub%2==0){ // 只有差为偶数才可以 因为是 其他门牌号的和减去润润加的门牌号
                          // 即相当于拿所有门牌号的号的和减去两遍润润家的门牌号的值 所以如果差值sub为奇数 则不符合条件
                int half_sub = sub/2; // 这里的half_sub就是计算出来的润润家的门牌号
                if(half_sub>=1 && half_sub<=cnt){
                    printf("%d %d\n", half_sub, cnt);
                    return 0;
                }
            }
        }
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值