问题描述:
国王用金币支付他忠诚的骑士。在他服役的第一天,骑士收到一枚金币。在接下来的两天(服役的第二天和第三天)中,骑士获得两枚金币。在接下来的三天(服役的第四天,第五天和第六天)中,骑士获得三枚金币。在接下来的四天(服役的第七天,第八天,第九天和第十天)中,骑士获得四枚金币。这种付款模式将无限期地继续:在连续N天的每一天收到N金币后,骑士将在接下来的N + 1天连续每天收到N + 1金币,其中N是任何正整数。
您的程序将确定在任何给定天数(从第1天开始)支付给骑士的金币总数。
输入:
输入包含至少一行但不超过21行。输入文件的每一行(最后一行除外)包含问题的一个测试用例的数据,由一个整数(在1..10000范围内)组成,表示天数。输入的结尾由包含数字0的行发出信号。
输出:
每个测试用例只有一行输出。此行包含相应输入行的天数,后跟一个空格以及从第1天开始在给定天数内支付给骑士的金币总数。
样例输入:
10 6 7 11 15 16 100 10000 1000 21 22 0
样例输出:
10 30 6 14 7 18 11 35 15 55 16 61 100 945 10000 942820 1000 29820 21 91 22 98
想法:把每天需要给的金币数列出来,每个阶段一行,就像这样:
1
2 2
3 3 3
... ... ...
n ... ... n
恰好每一行的数字和行一样,用一个变量计数直到给定天数,将金币逐行累加,每一列从1到行号,每加一个数就计数一次,计数到给定天数结束。
import java.util.Scanner; public class Main { public static void main(String[] args) throws Exception { Scanner sc = new Scanner(System.in); while(sc.hasNext()) { int day=0,n=0,money=0; day = sc.nextInt(); if(day==0) break; for(int i=1,cn=1;cn<=day;i++) {//cn记录天数,从1开始,直到给定天数day for(int j=1;j<i+1&&cn<=day;j++,cn++) { money+=i; } } System.out.println(day+" "+ money); } sc.close(); } }