【基础循环算法】问题 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;
}

### 门牌号胡同总户数计算方法 根据问题描述,需要找到一个满足条件的门牌号 $x$ 和总户数 $k$。已知所有门牌号之和减门牌号的两倍等于给定的正整数 $n$。具体公式如下: $$ \text{总和} = \frac{k(k+1)}{2} $$ $$ \text{条件} = \frac{k(k+1)}{2} - 2x = n $$ 通过上述公式可以推导出以下关系式[^3]: $$ x = \frac{\frac{k(k+1)}{2} - n}{2} $$ 为了确保解的存在性,必须满足以下条件: 1. $\frac{k(k+1)}{2} > n$,即总和必须大于 $n$。 2. $(\frac{k(k+1)}{2} - n)$ 必须是偶数,以保证 $x$ 是整数。 3. $x$ 的值必须在合法范围内,即 $1 \leq x \leq k$。 以下是实现该算法的 Python 代码示例: ```python def find_house_number(n): k = 1 while True: total = k * (k + 1) // 2 # 计算1到k的总和 if total < n: # 总和需大于n k += 1 continue diff = total - n if diff % 2 != 0: # 差值必须能被2整除 k += 1 continue x = diff // 2 if 1 <= x <= k: # 确保x在合法范围内 return x, k k += 1 # 示例输入 n = int(input()) house_number, total_houses = find_house_number(n) print(f"{house_number} {total_houses}") ``` 上述代码中,首先通过循环逐步增加 $k$ 的值,直到满足条件为止。然后根据公式计算出门牌号 $x$ 和胡同的总户数 $k$[^3]。 ### 输出结果格式 程序输出的结果为一行,包含两个正整数,分别表示门牌号胡同的总户数,中间用单个空格隔开。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值