题目连接:https://vjudge.net/contest/279567#overview 题目密码:190118html
Calculate A + B.ios
Input contains multiple test cases。 Each test case contains two integers: A(1 ≤ A ≤ 100) and B(1 ≤ B ≤ 100).git
For each test case output the sum A + B.数组
1 2 3 4
3 7
简单的EOF输入,多行重复输入后再进行求和。网络
代码以下:ide
#include <stdio.h> int main() { int a, b; while (scanf("%d %d", &a, &b) != EOF) { printf("%d", a + b); } return 0; }
给定两个正整数,计算这两个数的最小公倍数。函数
输入包含多组测试数据,每组只有一行,包括两个不大于1000的正整数.测试
对于每一个测试用例,给出这两个数的最小公倍数,每一个实例输出一行。spa
10 14
70
运用Wiki百科上已有关于最小公倍数和最大公约数的函数,进行编写程序。(我的函数库——最大公约数和最小公倍数).net
代码以下:
#include <stdio.h> int GCD(int a, int b); int LCM(int a, int b); int main() { int a, b; while (scanf("%d %d", &a, &b) != EOF) { printf("%d\n", LCM(a, b)); } return 0; } int GCD(int a, int b) { if (b) while ((a %= b) && (b %= a)); return a + b; } int LCM(int a, int b) { return a * b / GCD(a, b); }
Given two dates, please calculate the number of February 29 between the two dates inclusively.
Only a leap year contains February 29. The year satisfying one of the following conditions is a leap year.
\1. The year number can be divided by 4 but cannot be divided by 100.
\2. The year number can be divided by 400.
The first line contains an integer T, indicating the number of test cases.
Each test case contains two lines which are both in the format "Month Day, Year", indicating the dates. Month is a string contained in {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November" , "December"}. Day and Year are two integers.
We guarantee that all the dates are valid. The first date comes before the second date or the two dates are the same.
For each test case, output a line containing "Case #X: Y". X is the test case number starting from 1, and Y is the answer.
4 January 12, 2012 March 19, 2012 August 12, 2899 August 12, 2901 August 12, 2000 August 12, 2005 February 29, 2004 February 29, 2012
Case #1: 1 Case #2: 0 Case #3: 1 Case #4: 3
这里的核心思想是:分别计算从公元1年到起始年和到结束年的闰年个数,而后用差值的方式计算出两年之间的闰年个数。
可是值得注意的是,在首尾两端的年份,咱们须要判断它的日期是否包含2月29日,不然即便它是闰年也没用。
而后我在这里使用了一个C++中的用法:string
。这也是一种数据类型,用于字符和字符串。下面是三种用于声明字符和字符串数组的方法:
char Array1[5] = { 'a','b','c','d','e' }; char Array2[5][10] = { "one","two","three","four","five" }; string Array3[5] = { "one","two","three","four","five" };
咱们都知道数组的下标严格控制数据的个数,在第一种数组中就是严格的5个数组。
第二种数组中,咱们使用的是二维数组,最开始数组里面都是空,而后在录入的过程当中会在字符结束的时候会将 '\0'
录到结尾,可是不会显示。也就是说本来5个的储存空间的会变成6个,这是字符串数组,具体的请查询专业书籍,这里只是点出。
可是这会又一个很大的问题,那就是会浪费内存空间,并且这样会声明不少子数组,致使地址的复杂,可是若是是 string
数组的话,就不会浪费内存,并且他会在字符串录入结束后自动赋予 '\0'
这无疑是一种很好的方法,而且 string
数组只有一个地址,那就是数组名的初地址,这与一维数组的应用是一致的,更方便使用和理解。
代码以下:
#include <cstdio> #include <string> string months[12]= { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November" , "December" }; bool isLeapYear(int year); int Calculation(int year, int mon, int day); int main() { int T; scanf("%d", &T); for (int t = 1; t <= T; t++) { char CharStartMonth[10], CharEndMonth[10]; int StartDay, StartYear, StartMonth, EndDay, EndYear, EndMonth; scanf("%s %d, %d", &CharStartMonth, &StartDay, &StartYear); scanf("%s %d, %d", &CharEndMonth, &EndDay, &EndYear); for (int i = 0; i < 12; i++) // 将字符串对应的年份换算成数字年份 { if (CharStartMonth == months[i]) StartMonth = i + 1; if (CharEndMonth == months[i]) EndMonth = i + 1; } int num1 = Calculation(StartYear, StartMonth, StartDay); int num2 = Calculation(EndYear, EndMonth, EndDay); int res = num2 - num1; // 闰年差,得出两个年份之间的闰年个数 if (isLeapYear(StartYear) && StartMonth == 2 && StartDay == 29) // 若是正好是 2月29日 的时候,则该年算是闰年 res++; printf("Case #%d: %d\n", t, res); } return 0; } bool isLeapYear(int year) // 闰年判断函数 { if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) return true; else return false; } int Calculation(int year, int mon, int day) { int sum = year / 4 + year / 400 - year / 100; // 计算出从 公元1年 至目前全部的闰年个数 if (isLeapYear(year) && (mon < 2 || mon == 2 && day < 29)) // 判断起始年或终止年是否包含 2月29日 sum--; return sum; }
Given a positive integer N, you should output the most right digit of N^N.
The input contains several test cases. The first line of the input is a single integer T which is the number of test cases. T test cases follow. Each test case contains a single positive integer N(1<=N<=1,000,000,000).
For each test case, you should output the rightmost digit of N^N.
2 3 4
7 6
In the first case, 3 * 3 * 3 = 27, so the rightmost digit is 7. In the second case, 4 * 4 * 4 * 4 = 256, so the rightmost digit is 6.
题目的要求是 (1 <= N <= 1,000,000,000)
这么一个范围是绝对的会超出目前咱们全部的数据类型,甚至硬盘放不放不下都是一个问题。可是根据题意,咱们只须要求出最后一位的数就行。
那么咱们经过初步的草稿运算能够得出如下的规律:
7*7=49 7*7=49……9 49*7=343 7*9=63……3 343*7=2401 7*3=21……1 ……
那就是若是每次乘幂以前对10取余,也就是只取最后一位数字,而后继续进行乘幂运算。这样的话对最后一位的数字并无什么改变。咱们的代码也是源于这样的一个思路而展开的。
值得注意的是咱们采用的是 long
而不是 int
,由于可能仍是在运算过程当中会有超出 int
范围的数据出现,好比任何大于或等于 2
的数乘以 1,000,000,000
,则会超出 int
的范围。因此为了不这种事情的发生,咱们采用 long
。
代码以下:
#include <stdio.h> long long Pow(long long base, long long index); int main() { int len = 0, num = 0; scanf("%d", &len); while (len--) { cin >> num; printf("%d\n", Pow(num, num)); } return 0; } long long Pow(long long base, long long index) { int temp = 1; base = base % 10; while (index > 0) { if (index % 2 == 1) temp = (temp * base) % 10; index = index / 2; base = (base * base) %10; } return temp; }
"都8102年了"是2018年网络流行语,8102是将今年年份2018的各位数字倒排的结果,经常使用来表达“都这个年头了,怎么还有某某事情发生"之意。
这个梗的关键在于将年份各位数字倒排以后,获得一个很是遥远的将来年份。小Hi想知道,哪些年份适合使用这个梗。具体来讲,一个年份Y,倒排以后获得年份X,若是X-Y>=1000,咱们就认为Y适合这个梗。
给定起止年份,请你判断这段时间内有几个年份适合这个梗。
两个正整数表明年份,A和B。
1000 <= A <= B <= 9999
一个整数表明答案
2018 2020
2
这里的思路十分简单,只需将一个四位数致使而后减去原数大于等于1000便可。若是出现 1000 -> 0001
状况,则看为 1
便可。
代码以下:
#include <iostream> #include <cstdio> using namespace std; int main() { int StartYear, EndYear, AllYear = 0; scanf("%d %d", &StartYear, &EndYear); for (int i = StartYear; i <= EndYear; i++) { int year = i, sum = 0; for (int j = 0; j < 4; j++) // 数据转置 { sum = sum * 10 + year % 10; year /= 10; } if (sum - i >= 1000) AllYear++; } printf("%d", AllYear); return 0; }