该问题要求计算一周中每一天发生的13分之几。这是我的代码。
class CopyOffriday {
public static void main(String[] args) throws IOException {
BufferedReader f = new BufferedReader(new FileReader("friday.txt"));
int n1=Integer.parseInt(f.readLine());
int[] counter=new int[7];
int N=1900+n1-1;
int position=1; //first 13th is a Saturday
for(int i=1900; i<=N;i++){
for(int month=1; month<=12;month++){
if((i==1900)&&(month==1)) counter[position-1]++;
else if((i==N)&&(month==11)){
position+=2;
position%=7;
counter[position-1]++;
System.out.println(i+" "+month+" "+ position+" ");
break; }
else if((month==4)|| (month==6)||(month==8)||(month==11))
position+=2;
else if(month==2){
if((i%400==0)||((i%100!=0)&&(i%4==0)))
position+=1;
else
position+=0; }
else
position+=3;
if(position>7) position%=7;
counter[position-1]++;
System.out.println(i+" "+month+" "+ position+" ");
}
}
for(int x : counter){
System.out.print(x+" ");
}}
我真的很沮丧,因为我的逻辑给出了错误的答案。我要做的是增加额外的天数,即31天为3天,30天为2天,等等,然后将其添加到该职位。但这给出了错误的答案。
我的逻辑怎么了。
我对于陷入这个简单的问题感到非常沮丧。非常感谢所有帮助。
谢谢!
知道了!
for (int i = 1900; i <= N; i++) {
for (int month = 1; month <= 12; month++) {
if ((i == 1900) && (month == 1)) {
counter[position - 1]++;
position = 31%7 + 1;
}
有两个错误,首先应该有9个而不是8个错误。我们遵循的一般逻辑是,我们知道1900年第一个错误日是13日。一旦进入1900年1月的代码,就需要两件事情。首先,计算周六的增量计数,然后由于一月有31天,因此您可以循环查找2月的第13天,即您以相同的代码从1900年1月13日移至1900年2月13日,方法是增加31天这是2月13日至1月13日之间的天数。要将其转换为一天,请执行31%7(在您的情况下为+1,因为您的编号从1开始)。因此,在月=一月的循环中,二月也将增加。
对于month = Feb,您循环查找三月的日期,并在for循环关闭时增加。同样,在循环月份=
11月中,您循环查找以查找Decemeber的日期,然后在年份为最后一年的情况下中断,以免溢出到下一年。如果年份不是最后的年份,则进入
if ((month == 4) || (month == 6) || (month == 9)
|| (month == 11))
并按惯例进行业务并在12月份继续增加而不会中断。对于month =
December,您增加了第二年1月13日的天数,因此使我们能够隔离1900年1月的特殊情况,因为任何其他年份的1月都会跳过所有if语句并执行
position += 3;
没有任何问题。特殊情况 :
if ((i == 1900) && (month == 1)) {
counter[position - 1]++;
position = 31%7 + 1;
}
您的完整代码。
public static void main(String[] args) throws IOException {
// Use BufferedReader rather than RandomAccessFile; it's much faster
BufferedReader f = new BufferedReader(new FileReader(
"/home/shaleen/USACO/friday/friday.in"));
// input file name goes above
PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter(
"/home/shaleen/USACO/friday/friday.out")));
// Use StringTokenizer vs. readLine/split -- lots faster
// StringTokenizer st = new StringTokenizer(f.readLine());
// Get line, break into tokens.
int n1 = Integer.parseInt(f.readLine());
int[] counter = new int[7];
int N = 1900 + n1 - 1;
int position = 1; // first 13th is a Saturday
for (int i = 1900; i <= N; i++) {
for (int month = 1; month <= 12; month++) {
if ((i == 1900) && (month == 1)) {
counter[position - 1]++;
position = 31%7 + 1;
}
else if ((i == N) && (month == 11)) {
position += 2;
position %= 7;
counter[position - 1]++;
System.out.println(i + " " + month + " " + position + " ");
break;
} else if ((month == 4) || (month == 6) || (month == 9)
|| (month == 11))
position += 2;
else if (month == 2) {
if ((i % 400 == 0) || ((i % 100 != 0) && (i % 4 == 0)))
position += 1;
else
position += 0;
} else
position += 3;
if (position > 7)
position %= 7;
counter[position - 1]++;
System.out.println(i + " " + month + " " + position + " ");
}
}
for (int x : counter) {
System.out.print(x + " ");
}
}
}
我有一个可搜索的术语数组,我想使用Lucene基本上CTRL-F通过这个文档堆栈,找到并存储所有这些术语在该文档堆栈中的位置。例如: 术语:“A”、“B”、“C” null 差不多吧。我怎么能这么做?到目前为止,我只是使用一个StandardAnalyzer,如下所示: Lucene最初会生成很多文档,但后来删除了除。cfs文件以外的所有文档。我如何保留其他文件来执行我的查询?
在mergeSort函数中传递两个数组的main函数,一个原始数组和第二个临时数组,用于在其中存储排序值。 当我在合并排序后在主函数中打印 temp 时,我得到的输出为 temp = [3 2 6 4 7 8 5 8 1]。 我在 mergeSort 函数中传递了两个数组。一个是原始的,它是,第二个是在其中存储排序元素的临时数组。
这样写有什么问题?
比较 数字 计算 间隔 否则 与 或 开关 计数器 保持 延时 平均 今天日期 现在时间 波形 序列 随机数 映射 过滤 函数 计算+ 比较+ 阀门
我将在秋季开始一个计算机科学项目,我正试图在开始前建立我的编程能力。 我正在研究麻省理工学院OCW 6.0的问题,第一个是产生第1000个素数。显然,我想生成自己的代码,所以我想知道我的逻辑出了哪里问题。 你们太棒了,所以我不会在这里解释每一行,但我的逻辑要点是,我希望这个循环从n开始。如果 n 是质数,则将其添加到列表中,并将 1 添加到计数器中,如果没有,请转到下一个数字。最后,打印列表,以第
我在这个URL上安装了一个应用程序:。servlet支持两种传递参数的方式——作为查询字符串和作为路径信息(例如和)。它的设计目的是对位于服务器上的引用XML文件应用默认转换,生成HTML文件,并将其发送回浏览器。有点不对劲,尽管servlet在这两种情况下都会生成html,但浏览器在第一个示例中将其呈现为html,在第二个示例中呈现为XML。此外,当我比较这两种情况下的HTTP响应(包括状态码、