金幣問題(國王將金幣作爲工資,發放給忠誠的騎士。)

題目描述
國王將金幣作爲工資,發放給忠誠的騎士。第一天,騎士收到一枚金幣;之後兩天(第二天和第三天),每天收到兩枚金幣;之後三天(第四、五、六天),每天收到三枚金幣;之後四天(第七、八、九、十天),每天收到四枚金幣……;這種工資發放模式會一直這樣延續下去:當連續N天每天收到N枚金幣後,騎士會在之後的連續N+1天裏,每天收到N+1枚金幣。

請計算在前K天裏,騎士一共獲得了多少金幣。
輸入
輸入只有1行,包含一個正整數K(1≤K≤10000),表示發放金幣的天數。
輸出
輸出只有1行,包含一個正整數,即騎士收到的金幣數。
樣例輸入
6
樣例輸出
14
提示
騎士第一天收到一枚金幣;第二天和第三天,每天收到兩枚金幣;第四、五、六天,每天收到三枚金幣。因此一共收到 1+2+2+3+3+3=14 枚金幣。
【分析】
騎士收的金幣數寫成以下形式,更容易想到解題方法
以前10天(包括第10天)收到的金幣數爲例,則收到的金幣數爲:
1 (第一天)
2 2 (第二、三天)
3 3 3 (第四、五、六天)
4 4 4 4 (第七、八、九、十天)
若想打印上面的這個數字三角形的話,只需兩個for循環即可:

for(int i=1;i<=4;i++){
		for(int j=1;j<=i;j++){
			cout<<i<<" ";
		}
		cout<<endl;
	}

類比這段代碼,內層for循環可以代表天數,那隻需修改循環終止的條件,當天數day==k時,終止循環即可。
該題解決代碼如下:

#include<iostream>
using namespace std;
int main(){
	int k,day=0,sum=0;
	cin>>k;
	for(int i=1;;i++){
		for(int j=1;j<=i;j++){
			day++;
			sum+=i;
			if(day==k){//當天數等於給定的天數時,輸出金幣總數,終止程序
				cout<<sum;
				return 0;
			}
		} 
	}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章