题目链接
https://www.luogu.com.cn/problem/B2133
解题思路
使用双重循环进行遍历。外层循环遍历所有的胡同的门牌号,内层循环遍历我家的门牌号,并用sum变量求门牌号的和,如果满足题目要求就输出答案退出程序。
解题代码
C代码
#include<stdio.h>
int N = 100000;
int main(){
int n,sum = 0;
scanf("%d",&n);
for(int i=1;i<N;i++){
sum += i; //求前缀和
for(int j=1;j<=i;j++){ //枚举每一个我的门牌号
if(sum - 3*j == n){ //判断是否符合题意
printf("%d %d",j,i);
return 0;
}
}
}
return 0;
}
C++代码
#include<iostream>
using namespace std;
const int N = 100010;
int main()
{
int n,sum = 0;
cin>>n;
for(int i=1;i<N;i++){
sum += i; //求前缀和
for(int j=1;j<=i;j++){ //枚举每一个我的门牌号
if(sum - 3*j == n){ //判断是否符合题意
cout<<j<<' '<<i;
return 0;
}
}
}
return 0;
}
Java代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
//输入数据
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int sum = 0;//门牌和
for (int i = 1; ; i++){//遍历所有的门牌
boolean flag = false;
sum += i;//求门牌和
for (int j = 1; j <= i; j++){//我家门牌是从1到i
if(sum - j - j * 2 == n){//若其余各家的门牌号之和为sum - j,减去我家门牌号j的两倍,恰好等于n
System.out.print(j + " " + i);
flag = true;
break;
}
}
if(flag){//找到答案,退出循环
break;
}
}
}
}