题目
我家住在一条短胡同里, 这条胡同的门牌号从1开始顺序编号。
若所有的门牌号之和减去我家门牌号的两倍,恰好等于n,求我家的门牌号及总共有多少家。
数据保证有唯一解。
时间限制: 1000
内存限制: 65536
输入
一个正整数n。n < 100000。
输出
一行,包含两个正整数,分别是我家的门牌号及总共有多少家,中间用单个空格隔开。
样例输入
100
样例输出
10 15
解题思路
首先输入头文件,使用<bits/stdc++.h>万能头文件,当然,这道题不难,可以直接使用<iostream>,使用命名空间,调用主函数。
#include<bits/stdc++.h>
using namespace std;
int main()
根据题目要求,输入一个正整数,于是定义int n,并输入cin>>n(图中其他变量后面会用到)。
int n,a=0;
cin>>n;
由于我们并不知道这条街上有多少户,“我”也不知道住在第几号,所以可以采用“暴力枚举”的方式解题。首先如上图所示,定义一个名为“a”以0开始的int变量代表一共有a户。不知道会有多少户,就可以用while(true)或者while(1)进行循环。while下的第一个用a++递增a,假设这时a是0,就会变成1,代表一共有1户人家。题目中有特殊要求:若所有的门牌号之和减去我家门牌号的两倍,恰好等于n。就在循环中定义:int sum=0这样也可以让每次循环,sum重新定义并归零。
while(true){
a++;
int sum=0;
\\\\
}
开始循环嵌套,定义i为循环变量,代表第i户,随机任意一个i都会小于总的户数,所以i<=a;i++。在循环内部,写上sum+=i,让i的每个值都加入到sum中。
for(int i=1;i<=a;i++)
sum+=i;
开始另外一个while内部的循环,这次的循环变量i代表“我”住的门牌号,从1开始,并且永远小于总的户数,并且递增,所以for(int i=1;i<=a;i++)。内部是一个if判断,根据题目中的条件“若所有的门牌号之和减去我家门牌号的两倍,恰好等于n”写出if(sum-i*2==n),如果判断成功,将输出“我”的门牌号i,一个空格再加上总的户数,最后return 0结束程序。如果没有符合该判断,将再次i++,测试下一个i是否合适,当i超过a的时候,开始下一次的while循环。成品如下:
代码展示
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,a=0;
cin>>n;
while(true){
a++;
int sum=0;
for(int i=1;i<=a;i++)
sum+=i;
for(int i=1;i<=a;i++){
if(sum-i*2==n){
cout<<i<<" "<<a<<endl;
return 0;
}
}
}
}