题目如上图所示
在这里我提供两种方法
1、数学法
2、嵌套循环
我在写这道题时首先想的是数学法,我看洛谷题解和csdn都没有,特此记录。
一、数学法
总体思路是由题推断出门牌最大值和我家门牌数的关系,可知门牌最大值和我家门牌号密切相关,一一对应,设总共有b家人,我家的门牌号为a。然后推断出b关于a的表达式,a关于n的表达式,后续就可以利用for循环去寻找符合题意的a的值,进而再找到b的值。
由题易得以下关系:
#include<stdio.h>
#include<math.h>
int main()
{
int n,a,b,max; //max为a的上述最大值
scanf("%d",&n);
max=(5+sqrt(25+8*n))/2;
for(a=1;a<=max;a++)
{
b=(sqrt(1+8*n+24*a)-1)/2; //b关于a的表达式
if(b*(1+b)/2-3*a==n){ //a与b一开始满足的关系式
printf("%d %d",a,b);
}
}
return 0;
}
二、嵌套循环
同样是利用a和b的初始关系,做法很常规,不再赘述。
#include<stdio.h>
int main()
{
int a,b,n;
scanf("%d",&n);
for(b=1;;b++){
for(a=1;a<=b;a++){
if((b*(b+1))/2-3*a==n){
printf("%d %d",a,b);
return 0;//提前结束程序
}
}
}
}
这里可以补充一个小白的知识点:
return可以起到一个结束程序的作用。