问题 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;
}