记录一下刷OJ的日常,跨考小白,写得不好的地方请大佬们指正。
【基础题】
1 求长方形的面积和周长
问题描述 :
求一个长方形的面积S及周长P。面积的公式为S = a × b,周长的公式P=2*(a+b),其中a代表长方形的长,b代表长方形的宽。
输入说明 :
你的程序需要从标准输入设备(通常为键盘)中读入两个整数:一个整数a(0 ≤a < 10000),代表长方形的长;一个整数b(0 ≤ b < 10000),代表长方形的宽;在a和b之间有一个空格;在行首和行尾没有多余的空格。
输出说明 :
你的程序需要向标准输出文件(通常为启动该程序的终端)输出对应的答案。答案占一行,其中包含两个整数,即长方行的面积和周长,中间以一个空格分隔。在行首和行尾不要输出多余的空格。
#include <iostream>
using namespace std;
int main() {
int a, b;
cin >> a >> b;
int S = a * b;
int P = 2 * (a + b);
cout << S << " " << P <<endl;
return 0;
}
2 数列和
问题描述 :
尝试求从1+2+…+N这N个自然数的和。
输入说明 :
你的程序需要从标准输入设备(通常为键盘)中读入一个整数N(1 ≤ N < 10,000);在行首和行尾没有多余的空格。在所有数据的前后,以及两组数据之间都没有多余的空行。
输出说明 :
对每组测试数据,你的程序需要向标准输出设备(通常为启动该程序的终端)输出对应的答案,其中仅有一个整数,即题目描述中的数列之和。在行首和行尾不要输出多余的空格。
#include <iostream>
using namespace std;
int main() {
int N; int S = 0;
cin >> N;
for (int i = 1; i <= N; i++) {
S= S+i;
}
cout << S <<endl;
return 0;
}
3 解方程
问题描述 :
编写程序:输入a、b后,输出一元一次方程2*a*x+3*b-5=0的解。
输入说明 :
整数a b
输出说明 :
x 保留1位小数
#include <iostream>
#include <iomanip>
using namespace std;
int main() {
float a, b;
cin >> a >> b;
float x = (5 - 3 * b) / (2 * a);
cout << fixed <<setprecision(1)<< x <<endl;
return 0;
}
4 一个月的天数
问题描述 :
输入年和月,输出该月有几天。
输入说明 :
输入两个整数,中间以空格分隔,第一个整数表示年,第二个整数表示月。
输出说明 :
输出该年该月的天数,输出时,行首与行尾均无空格,仅输出一个整数。
#include <iostream>
using namespace std;
int main()
{
int year, month;
cin >> year >> month;
switch (month)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
cout << 31 << endl; break;
case 4:
case 6:
case 9:
case 11:
cout << 30 << endl; break;
case 2:
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
cout << 29 << endl;
else
cout << 28 << endl; break;
default:
cout << "error" << endl;
}
return 0;
}
5 银行存款到期日
问题描述 :
银行存款有3个月、6个月定期等。从键盘输入一个日期(即为存款日期)以及定期的时间长度(单位为月,输入的时间长度可为小于等于60的任意正整数),请编程输出该定期存款的到期日期。 下面以3个月定期为例,说明定期的概念。
比如:
输入2014年4月30日,则到期日是2014年7月30日;
输入2014年3月31日,则到期日是2014年6月30日(6月没有31日,所以30日就到期);
输入2014年11月30日,则到期日是2015年2月28日;
输入2015年11月30日,则到期日是2016年2月29日。
输入说明 :
共输入4个整数,中间以空格分隔,第一个整数表示年,第二个整数表示月,第三个整数表示日,第四个整数表示定期长度(单位为月)。
输出说明 :
输出到期日期,共输出三个整数,中间以一个空格分隔,行首与行尾均无空格。
#include <iostream>
using namespace std;
int main() {
int year, month, day, period;
cin >> year >> month >> day >> period;
month = (month + period);
while ( month> 12) {
month = month % 12;
year= year + 1 + period/12;
}
if (month == 4 || month == 6 || month == 9 || month == 11) {
if (day > 30) {
day = 30;
}
}
else if (month == 2) {
if (day > 29) {
if (year%400==0 ||(year%4==0 && year%100!=0)) {
day = 29;
}
else {
day = 28;
}
}
}
cout << year << " " << month << " " << day;
return 0;
}
6 实数运算
问题描述 :
输入两个实数,求它们的和,差,积,商。
输入说明 :
输入数据由两行组成:第一行为两个实数a、b,它们以空格分隔,在行首和行尾没有多余的空格;第二行为运算符号'+'、'-'、'*'、'/'之一,在行首和行尾没有多余的空格。
输出说明 :
输出运算结果(保留一位小数),行首和行尾没有多余的空格,当除数为0时输出'Wrong!'
#include <iostream>
#include <iomanip>
using namespace std;
int main() {
double a, b;
char op;
cin >> a >> b;
cin >> op;
if (op == '+') {
cout << fixed << setprecision(1) << a + b << endl;
}
else if (op == '-') {
cout << fixed << setprecision(1) << a - b << endl;
}
else if (op == '*') {
cout << fixed << setprecision(1) << a * b << endl;
}
else if (op == '/') {
if (b == 0) {
cout << "Wrong!" << endl;
}
else cout << fixed << setprecision(1) << a / b << endl;
}
return 0;
}
7 解二次方程
问题描述 :
编写程序求方程ax2+bx+c=0的根,a、b、c的值由键盘输入,假设b2-4ac>0
输入说明 :
3个整数a b c,以一个空格分隔
输出说明 :
两个根,大数在前,小数在后
输出时保留两位小数。
#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;
int main() {
int a, b, c;
cin >> a >> b >> c;
int discriminant = b * b - 4 * a * c;
if (discriminant > 0) {
double X1 = (-b + sqrt(discriminant)) / (2 * a);
double X2 = (-b - sqrt(discriminant)) / (2 * a);
cout << fixed << setprecision(2) << X1 << " " << X2 << endl;
}
else {
cout << "Wrong!" << endl;
}
}
8 门票价格计算
问题描述 :
某旅游景点门票价格为每人5元。但团体可以优惠,分为以下情况:
人数超过20,则所有人优惠10%;
人数超过40,则所有人优惠15%;
人数超过80,则所有人优惠20%;
人数超过120,则所有人优惠30%。
请跟据团体的人数,求出该团体的总门票价格。
输入说明 :
输入一个整数i(0≤i≤1,000),表示一个团体的总人数。在行首和行尾没有多余的空格。
输出说明 :
输出一个实数,即该团体需要支付的总票价,精确到小数点后2位。在行首和行尾不要输出多余的空格。
#include <iostream>
#include <iomanip>
using namespace std;
int main() {
int people;
double price;
cin >> people;
if (people>= 0 && people <= 20) {
price = people * 5;
}
else if (people > 20 && people <= 40) {
price = people * 5 * 0.9;
}
else if (people > 40 && people <= 80) {
price = people * 5 * 0.85;
}
else if (people > 80 && people <= 120) {
price = people * 5 * 0.8;
}
else if (people > 120 && people <=1000) {
price = people * 5 * 0.7;
}
cout << fixed << setprecision(2) << price << endl;
}
9 星期几问题
问题描述 :
根据一个范围在0至6的整数,用英文输出它对应的是星期几。(0对应Sunday,1对应Monday, 2对应Tuesday, 3对应Wednesday, 4对应Thursday, 5对应Friday, 6对应Saturday)
输入说明 :
输入一个整数n(0 ≤ n ≤ 6)。在行首和行尾没有多余的空格。
输出说明 :
输出一个字符串,即输入n对应的星期几的英文名称,请注意大小写。在行首和行尾不要输出多余的空格。
#include <iostream>
using namespace std;
int main() {
int day;
string today;
cin >> day;
switch (day){
case 0: today = "Sunday"; break;
case 1: today = "Monday"; break;
case 2: today = "Tuesday"; break;
case 3: today = "Wednesday"; break;
case 4: today = "Thursday"; break;
case 5: today = "Friday"; break;
case 6: today = "Saturday"; break;
default: today = "Invalid day"; break;
}
cout << today << endl;
return 0;
}
10 时间相加
问题描述 :
输入两个时间A和B,分别都由3个整数组成,分别表示时分秒,比如,假设A为34 45 56,就表示A所表示的时间是34小时 45分钟 56秒。
输出A+B即两个时间相加后的结果。
输入说明 :
输入数据由6个整数AH,AM,AS,BH,BM,BS组成,分别表示时间A和B所对应的时分秒。题目保证所有的数据合法。
输出说明 :
输出A+B,输出结果也由时分秒三部分组成,同时也要满足时间的规则(即:分和秒的取值范围在0~59),输出仅占一行,整数之间以一个空格分隔,行首与行尾无多余空格。
#include <iostream>
using namespace std;
int main() {
int AH, AM, AS, BH, BM, BS;
int Hour, Min, Sec;
cin >> AH >> AM >> AS >> BH >> BM >> BS;
Sec = AS + BS;
Min = AM + BM;
Hour = AH + BH;
if ( Sec >= 60) {
Sec = Sec % 60;
Min++;
}
if ( Min >= 60) {
Min = Min % 60;
Hour++;
}
cout << Hour << " " << Min << " " << Sec << endl;
return 0;
}
11 成绩转换
问题描述 :
输入一个百分制的成绩t,将其转换成对应的等级,具体转换规则如下:
90~100为A;
80~89为B;
70~79为C;
60~69为D;
0~59为E;
输入说明 :
输入一个整数。
输出说明 :
输出对应结果,占一行。如果输入数据不在0~100范围内,请输出一行:“Score is error!”。
注意:无多余空格。
#include <iostream>
using namespace std;
int main() {
int score;
string grade;
cin >> score;
if (score <= 100 && score>= 90) {
grade = "A";
}
else if (score <= 89 && score >= 80) {
grade = "B";
}
else if (score <= 79 && score >= 70) {
grade = "C";
}
else if (score <= 69 && score >= 60) {
grade = "D";
}
else if (score <= 59 && score >= 0) {
grade = "E";
}
else {
grade = "Score is error!";
}
cout << grade << endl;
return 0;
}
12 求第几天
问题描述 :
按年、月、日的顺序读入一个日期,输出该日期是这一年中的第几天。
输入说明 :
输入数据为三个正整数y 、m、d,分别表示年、月、日,整数之间以空格分隔,在行首和行尾没有多余的空格。
输出说明 :
输出一个整数,表示输入的日期是这一年中的第几天,在行首和行尾没有多余的空格。
#include <iostream>
using namespace std;
int main() {
int y, m, d, today=0;
cin >> y >> m >> d;
int normalyear[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31};
int leapyear[13] = { 0,31,29,31,30,31,30,31,31,30,31,30,31 };
if ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0) {
for (int i = 2; i <= m; ++i) {
today += leapyear[i - 1];
}
today += d;
}
else {
for (int j = 2; j <= m; ++j) {
today += normalyear[j - 1];
}
today += d;
}
cout << today << endl;
return 0;
}
13 求阶乘结果0的个数
问题描述 :
编写一个程序,求出N!的末尾含有多少个0。
提示:在乘积中,末尾有多少个0,主要看各乘数的素数因子中有多少个2和5,每一个2和5的结合将给末尾贡献一个0。而乘数中因子2的个数远多于因子5的个数,因此,就计算各乘数中因子5的个数即可。
输入说明 :
你的数据需要从标准输入设备(通常为键盘)中读入多组测试数据。每组输入数据由一行组成,每行由一个正整数N组成,N小于等于100000,在行首和行尾没有多余的空格。
输出说明 :
对每组测试数据,你的程序需要向标准输出文件(通常为启动该程序的文本终端)依次输出一组对应的答案。所有数据前后不要输出多余的空行,两组数据之间也不要输出多余的空行。每组输出数据由一行组成,每行由一个整数组成,在行首和行尾不要输出多余的空格。
#include <iostream>
using namespace std;
int GetFactor(int n) {
int count = 0;
while (n>=5) {
n /= 5;
count+=n;
}
return count;
}
int main() {
int number;
while (cin >> number) {
int count = GetFactor(number);
cout << count << endl;
}
return 0;
}
14 怪数
问题描述 :
寻找怪数:有一种奇怪的自然数,它的比其本身小的所有因子之和等于它本身,例如:6=1+2+3,其中1、2、3都是6的因子,编程找出整数N之内的所有怪数。
输入说明 :
输入一个整数N(10<=N≤10000),在行首和行尾没有多余的空格。
输出说明 :
输出N之内(<=N)的所有怪数,每一行输出一个整数。(注:若N中有3个怪数,你则需要输出三行,每行一个怪数。)所有数据前后没有多余的空格,中间也没有多余的空行。
#include <iostream>
using namespace std;
int IsStrange(int N) {
int sum = 1;
for (int i = 2; i < N; i++) {
if (N % i == 0) {
sum += i;
}
}
if (sum == N) {
return 1;
}
else return 0;
}
int main(){
int number;
while (cin >> number){
for (int j = 2; j <= number; j++) {
if (IsStrange(j)) {
cout << j << endl;
}
}
}
return 0;
}
15 abc数字
问题描述 :
明明的爸爸是一位著名的数学家同时也是一位著名的数学启蒙老师。他经常出一些简单而有趣的数学题目来给刚刚接触数学的小朋友做,培养他们对数学的兴趣。一天,明明的爸爸想到了这样一个题目。如果有a、b、c三个1位的正整数,那么按以下的方法构成2个三位数:第一种方法是a为百位,b为十位,c为个位,构成的数就是abc;第二种方法是c为百位,b为十位,a为个位,构成的数就是cba;然后将这两个三位数相乘,会得到另一个数。现在就要数一下这个相乘后所得到的数中,有几个数字是与a、b、c相同的。例如:a=1,b=2,c=3,这样构成的两个三位数分别是123和321,两数相乘得到39483,在这个数中有2个“3”与c所表示的“3”是一样的,因此有2个数字是与a、b、c其中之一相同的。明明的爸爸决定明天把这道题目给小朋友做,他手头有很多组这样的a、b、c,但是要把所有的a、b、c都通过上述的方法计算出结果来需要很多的时间,明明的爸爸没有那么多的时间,于是他求助于你,请你帮他写一个程序,用来计算出相应的结果。 明明爸爸的问题可以归结为:输入a,b,c三个一位数字,要求abc这样的一个三位数与cba这样的一个三位数相乘,输出其结果,再判断相乘后的结果中的数字中有多少位是与a、b、c相同的,并输出有几位相等。
输入说明 :
你写的程序要求从标准输入设备(通常,键盘为标准输入设备)中读入测试数据作为你所写程序的输入数据。标准输入设备中有多组测试数据,每组测试数据仅占一行,每行有三个正整数a、b、c,且a、b、c都为正整数,a、b、c中间用一个空格隔开。每组测试数据与其后一组测试数据之间没有任何空行,第一组测试数据前面以及最后一组测试数据后面也都没有任何空行。
输出说明 :
对于每一组测试数据,你写的程序要求计算出一组相应的运算结果,并将这一组运算结果作为你所写程序的输出数据依次写入到标准输出设备(通常,显示屏为标准输出设备)中。每组运算结果为两个整数,即abc和cba的乘积和有几位相等,两个数之间用一个空格隔开。每组运算结果单独形成一行数据,其行首和行尾都没有任何空格,每组运算结果与其后一组运算结果之间没有任何空行,第一组运算结果前面以及最后一组运算结果后面也都没有任何空行。
#include <iostream>
using namespace std;
int GetCount(int a, int b, int c, int product) {
int count = 0;
while (product > 0) {
int remainder = product % 10;
product /= 10;
if (a == remainder || b == remainder || c == remainder) {
count++;
}
}
return count;
}
int main() {
int a, b, c;
int product;
while (cin >> a >> b >> c) {
product = (100 * a + 10 * b + c) * (100 * c + 10 * b + a);
int count = GetCount(a, b, c, product);
cout << product << " " << count << endl;
}
}
16 奇妙的比值
问题描述 :
明明喜欢钻研各种各样的数学问题。一天,明明对数的因子产生了兴趣,他想把一个数的所有因子都找出来,然后把它们相加再去除以这个数,这样会得到一个比值。明明想看看不同的数的该比值会有什么不同,以便做研究。
例如6这个数,它一共有4个因子,分别是:1、2、3、6,把他们相加然后再除以6,即1+2+3+6=12,12/6=2,就可以得到2这个比值。
明明为了研究,需要得到大量的比值,但是如果通过手动计算比值的话需要花大量的时间,于是明明就想请你帮忙,帮他写一个程序,能够求数的比值。 明明的问题可以归结为:给你一个数,求所有因子和,把这些因子相加,然后再除以这个数,求得比值。
输入说明 :
你写的程序要求从标准输入设备中读入测试数据作为你所写程序的输入数据。标准输入设备中有多组测试数据,每组测试数据仅占一行,每行仅包括一个正整数n(1≤n≤120),代表所求比值的那个数。每组测试数据与其后一组测试数据之间没有任何空行,第一组测试数据前面以及最后一组测试数据后面也都没有任何空行。
输出说明 :
对于每一组测试数据,你写的程序要求计算出一组相应的运算结果,并将这一组运算结果作为你所写程序的输出数据依次写入到标准输出设备中。每组运算结果为一个浮点数,就是所求的比值,保留2位小数。每组运算结果单独形成一行数据,其行首和行尾都没有任何空格,每组运算结果与其后一组运算结果之间没有任何空行,第一组运算结果前面以及最后一组运算结果后面也都没有任何空行。(注:最后求得的比值保留2位小数。) 注:通常,显示屏为标准输出设备。
#include <iostream>
#include <iomanip>
using namespace std;
int GetSumofFactors(int number) {
int sumoffactors = 0;
for (int i = 1; i <= number; i++) {
if (number % i == 0) {
sumoffactors += i;
}
}
return sumoffactors;
}
int main() {
int num;
while (cin >> num) {
int sumoffactors = GetSumofFactors(num);
double ratio = (double)sumoffactors / (double)num;
cout << fixed << setprecision(2) << ratio << endl;
}
}
17 T的倍数N
问题描述 :
明明学习数学已经有很多年了,对各种各样的数学问题都有研究。有一天,明明的爸爸问明明说:“明明,你觉得你对数字敏感吗?”明明毫不犹豫地回答:“那当然,非常敏感。”于是明明的爸爸就说:“好,那我问你一个问题,如果有一个个位数为7的自然数N,把它的个位数移到最高位,其余各位均右移一位(如127变成712),要求这样得到的一个新的数是原数的T倍。若我现在把自然数T告诉你,你能求出最小的符合条件的自然数N吗?” 明明觉得这个问题很简单,只要按从小到大的顺序把所有是7结尾的自然数找出来,然后交换位置,再除一下,看看倍数是不是T倍就可以了。明明回答爸爸说:“这个问题很简单,来考我吧。”于是明明的爸爸就给了明明一个数字2,让他开始动手寻找。但是,使明明意想不到的是,他找了很久很久,始终没有找到想要的那个数,而当他到查到1000007时,需要的那个数还是没有出现,于是就放弃了。他觉得靠手工查找的话,是无法快速找到的。因此,明明求助于你,请你帮他写一个程序,来解决这个相当棘手的问题。但是他也给了你另外一个条件,如果找到超过1000000时还是没有找到需要的那个数的话,就停止寻找。 明明的问题可以归结为:对于一个个位数为7的自然数N,把它的个位数移到最高位,其余各位均右移一位,要求这样得到的一个新的数是原数的T倍。现给出这个自然数T,求满足这个要求的最小的自然数N。若在[1, 1000000] 的范围内没有找到N,则输出“No”。
输入说明 :
你写的程序要求从标准输入设备(通常,键盘为标准输入设备)中读入测试数据作为你所写程序的输入数据。标准输入设备中有多组测试数据,每组测试数据仅占一行,每行仅有一个自然数T(1≤T≤9)。每组测试数据与其后一组测试数据之间没有任何空行,第一组测试数据前面以及最后一组测试数据后面也都没有任何空行。
输出说明 :
对于每一组测试数据,你写的程序要求计算出一组相应的运算结果,并将这一组运算结果作为你所写程序的输出数据依次写入到标准输出设备(通常,显示屏为标准输出设备)中。每组运算结果输出一个自然数N或“No”,不包括双引号。每组运算结果单独形成一行数据,其行首和行尾都没有任何空格,每组运算结果与其后一组运算结果之间没有任何空行,第一组运算结果前面以及最后一组运算结果后面也都没有任何空行。
#include <iostream>
using namespace std;
int GetFirstSeven(int lastseven) {
int firstseven = 0; int digit = 1;
lastseven /= 10;
while (lastseven > 0) {
int digitnum = lastseven % 10;
firstseven += digitnum * digit;
digit *= 10; lastseven /= 10;
}
firstseven += 7 * digit;
return firstseven;
}
int main() {
int T;
while (cin >> T) {
int lastseven = 7;
while (lastseven <= 1000000) {
int firstseven = GetFirstSeven(lastseven);
if (firstseven / lastseven == T && firstseven % lastseven == 0) {
cout << lastseven << endl;
break;
}
lastseven += 10;
}
if (lastseven > 1000000) { cout << "No" << endl; }
}
}