1404:我家的門牌號(C C++)

英語不及格的小白發表於2020-10-20

【題目描述】

我家住在一條短衚衕裡,這條衚衕的門牌號從1開始順序編號。 若其餘各家的門牌號之和減去我家門牌號的兩倍,恰好等於n,求我家的門牌號及總共有多少家。資料保證有唯一解。

【輸入】

一個正整數n。n<100000。

【輸出】

一行,包含兩個正整數,分別是我家的門牌號及總共有多少家,中間用單個空格隔開。

【輸入樣例】

100

【輸出樣例】

12 16

【程式碼】1.0錯誤

寫了1.0發現不知道為什麼錯了 查了答案 放2.0 數學這…人傻了 我不行

#include <iostream>

using namespace std;
int f(int x)
{
 	long long s=0;
	for(int i=1;i<=x;i++)
		s+=i;
		return s;
}

int main()
{
	int n;
	cin>>n;
	for(int i=1;i<=1000;i++)
	{
		int s=f(i);
		for(int j=1;j<=i;j++)
		{
			if(s-2*j == n)
			{
				cout<<j<<" "<<i;
				break;
			}
			 
		}
	}
	return 0;
}

【程式碼】2.0

#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;
}

相關文章