题目描述
我家住在一条短胡同里,这条胡同的门牌号从1开始顺序编号。
若所有的门牌号之和减去我家门牌号的两倍,恰好等于n,求我家的门牌号及总共有多少家。
数据保证有唯一解。
输入格式
一个正整数n。n < 100000。
输出格式
一行,包含两个正整数,分别是我家的门牌号及总共有多少家,中间用单个空格隔开。
样例
样例输入
100
样例输出
10 15
有代码有思路
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int n,home,x;
int i;
cin>>n;//输入n
/*
设最后门牌号为k,则总和为:k*(k+1)/2
设家的门牌号为x,则由题意:k*(k+1)/2=3*x+n
即:k*(k+1)=6*x+2*n
又:k*(k+1)+k+1>6*x+2*n
得:(k+1)*(k+1)>6*x+2*n
开方:k+1>sqrt(6*x+2*n)
两边减一:k>sqrt(6*x+2*n)-1
x取最小值1:home=sqrt(6+2*n)-1
*/
// home=sqrt(6+2*n)-1;
for(i=1;; i++) //从家的门牌号开始逐个尝试
{
if((i*i+i-2*n)%6==0)
{
x=(i*i+i-2*n)/6;
if(x<=0) continue;//x不可能<1
if(x>0)//找到后
{
cout<<x<<" "<<i;//输出
break;//终止循环
}
}
}
return 0;
}
感觉输出怪怪的!
#include<bits/stdc++.h>
using namespace std;
int main()
{
int i,n;
int home,sum;
scanf("%d",&n);
home=sqrt(6+2*n)-1;
for(sum=home;;sum++)
{
if((sum*sum+sum-2*n)%6==0)
{
home=(sum*sum+sum-2*n)/6;
if(home<=0) continue;
if(home>0)
{
cout<<home<<" "<<sum<<endl;
break;
}
}
}
return 0;
}
#include<iostream>
using namespace std;
int now=1;
int tot=0;
int main(void)
{
int n;
int flag=0;
cin>>n;
while(true)
{
tot=tot+now;
now++;
int a;
for(int i=1;i<=now;i++)
if(tot-i*2==n)
{
cout<<i<<" "<<now-1;
flag=1;
break;
}
if(flag==1)break;
}
return 0;
}
#include<cstdio>
long long he = 0;
void sum(int x)
{
he = 0;
for(int i = 1; i <= x; ++i)
he += i;
}
int main()
{
int n;
scanf("%d",&n);
for(int i = 1; i <= 1000; ++i)//枚举所有的门牌号
{
sum(i);
for(int j = 1; j <= i ; ++j)//枚举我家的门牌号
{
if(he - 2*j == n)
{
printf("%d %d",j,i);
break;
}
}
}
return 0;
}
题目输出有问题