第3章:作业题

作业题

C3-1 直角三角形

  • 题目描述
    输入一个三角形的3边长度,判断该三角形是否为直角三角形,若是则输出True,若不是则输出False。推荐做法:定义一个函数,接受三个int参数,返回bool,再用主函数调用之。

  • 输入描述
    每行输入三个由空格隔开的整数 a, b, c ,表示三角形的 3 条边长
    1 <= a,b ,c <= 10000

  • 输出描述
    对于每一行输入,输出True或者False表明是否为直角三角形
    在这里插入图片描述

#include <iostream>
using namespace std;

bool isTriangle(int a, int b, int c) {
	if ((a*a + b * b == c * c) || (a*a + c * c == b * b) || (b*b + c * c == a * a))
		return true;
	else
		return false;
}

int main() {
	int a, b, c;

	while (cin >> a >> b >> c)
	{
		if (isTriangle(a, b, c))
			cout << "True" << endl;
		else
			cout << "False" << endl;
	}
	return 0;
}

C3-3丑数

  • 题目描述
    只包含因子2,3,5的正整数被称作丑数,比如4,10,12都是丑数,而7,23,111则不是丑数,另外1也不是丑数。请编写一个函数,输入一个整数n,能够判断该整数是否为丑数,如果是,则输出True,否则输出False。

  • 输入描述
    每行输入一个正整数 n
    1 <= n<= 1000000

  • 输出描述
    对于每一行输入,输出其是否为丑数,是则输出True,否则输出False

在这里插入图片描述

#include <iostream>
using namespace std;

bool uglyNum(int n) {
	if (n == 1) {
		return false;
	}

	int div[3] = { 2,3,5 };
	int flag;
	
	for (int i : div) {
		while (n%i == 0) {
			n = n / i;
		}
	}

	return (n == 1);
	
}

int main() {
	int n;
	while (cin >> n) {
		if (uglyNum(n))
			cout << "True" << endl;
		else
			cout << "False" << endl;
	}
	return 0;

}

斐波拉契数列

  • 题目描述
    斐波那契数列f(n)满足以下定义:
    f(0) = 1, f(1) = 1, f(n) = f(n-1) + f(n-2) (n >= 2)。
    本题的数据规模比原先更大

  • 输入描述
    每行输入一个整数 n
    0 <= n<= 80

  • 输出描述
    对于每一行输入,输出斐波那契数列第n项的值f(n)

C++整型数据取值范围

#include <iostream>
using namespace std;

//注意数据溢出问题
long long fib(int n) {
	if (n == 0 || n == 1)
		return 1;

	long long a=1,b=1;
	for (int i = 1; i < n; i++) {
		b = a + b;
		a = b - a;
	}
	return b;
}

int main() {
	int n;
	while (cin >> n) {
		cout << fib(n) << endl;
	}
	return 0;
}

最大公约数

  • 题目描述
    给定两个正整数,求他俩的最大公约数;
    要求使用递归,实现辗转相除法

  • 输入描述
    两个整数a,b;1<=a,b<=100000000

  • 输出描述
    最大公约数

  • 样例输入
    6 12

  • 样例输出
    6

辗转相除法求最大公约数

#include <iostream>
using namespace std;

int GCD(int a, int b) {
	int remainder = a % b;
	if (remainder == 0) {
		return b;
	}
	else
		return GCD(b, remainder);
}

int main() {
	int a, b;
	cin >> a >> b;
	cout << GCD(a, b) << endl;
	return 0;
}

回文字符串

  • 题目描述
    若一个字符串的正序与倒序相同,则称其为回文字符串;现在给定一个字符串,使用递归的方法,判断他是否是回文字符串。

  • 输入描述
    字符串,长度不超过100000;

  • 输出描述
    若是,则输出"Yes."
    若不是,则输出"No."

  • 样例输入
    abcadacba

  • 样例输出
    Yes.

//空间超限,只得了30分??
#include <iostream>
#include <string>
using namespace std;

bool isPalindrome(int low, int high, string str, int length) {
	if (length == 1 || length == 0)
		return true;
	if (str[low] != str[high])
		return false;
	return isPalindrome(low + 1, high - 1, str, length - 2);
}

int main() {
	string s;
	cin >> s;
	int len = s.size();
	if (isPalindrome(0, len - 1, s, len))
		cout << "Yes." << endl;
	else
		cout << "No." << endl;
	return 0;
}

开关灯问题

  • 题目描述
    有n盏灯,编号依次为1,2,3,…,n;初始化时,所有灯都是关闭状态;
    小明第一次将编号为1,2,3,…,共n盏灯都打开了;第二次将编号为2,4,6,…,共n/2盏灯都关闭了;第三次将编号为3,6,9,…,共n/3盏灯进行操作,若是之前关闭状态则打开,若是打开状态,则关闭;第四次将4,8,12,…,共n/4盏灯进行操作。这样操作了n次,问最后亮了几盏灯。

  • 输入描述
    第一行输入整数T,表示有T组测试用例;1<=T<=100
    接下来T行,每行有一个整数n,表示当前测试用例有n盏灯;1<=n<=1000

  • 输出描述
    输出n行,每次测试用例最后亮灯的数目。

  • 样例输入
    2
    1
    5

  • 样例输出
    1
    2

//转化为从1,到n,有多少个数因子的个数是奇数
#include <iostream>
using namespace std;

int numFactors(int number) { //number 有多少个因子
	int cnt = 0;
	for (int i = 1; i <= number; i++) {
		if (number%i == 0)
			cnt++;
	}
	return cnt;
}

int Lights(int n) {
	int numL=0;
	for (int i = 1; i <= n; i++) { //从第1盏灯到第n盏灯
		int cnt;
		cnt = numFactors(i);
		if (cnt % 2 == 1)
			numL += 1;
	}
	return numL;
}

int main() {
	int T;
	int n;
	cin >> T;
	for (int i = 1; i <= T; i++) {
		cin >> n;
		cout << Lights(n)<<endl;
	}

}

开灯关灯2

  • 输入描述
    第一行输入整数T,表示有T组测试用例;1<=T<=10000
    接下来T行,每行有一个整数n,表示当前测试用例有n盏灯;1<=n<=10000
    提示:总结开灯关灯规律。

可以发现,1:1,4:2,9:3,16:4

#include <iostream>
#include <cmath>
using namespace std;

int numFactors(int number) { //number 有多少个因子
	int cnt = 0;
	for (int i = 1; i <= number; i++) {
		if (number%i == 0)
			cnt++;
	}
	return cnt;
}

int Lights(int n) {
	return floor(sqrt(n));
}

int main() {
	int T;
	int n;
	cin >> T;
	for (int i = 1; i <= T; i++) {
		cin >> n;
		cout << Lights(n) << endl;
	}

}

A+B

  • 题目描述
    输入两个整数A,B,求A+B

  • 输入描述
    第一行,整数A
    第二行,整数B
    A,B位数长度均小于160

  • 输出描述
    A+B的结果

  • 样例输入
    1234567890987654321099999
    12345678901

  • 样例输出
    1234567890987666666778900

#include <iostream>
#include <string>
#include <cmath>
#include <algorithm>
using namespace std;

int main() {
	string s1, s2,results="";
	cin >> s1 >> s2;
	int num1, num2;
	int len1 = s1.size();
	int	len2 = s2.size();
	int carry = 0,sum;
	for (int i = 1; i <= max(len1, len2);i++) {
		if (i > len1)
			num1 = 0;
		else
			num1 = int(s1[len1-i]-'0');

		if (i > len2)
			num2 = 0;
		else
			num2 = int(s2[len2  - i]-'0');

		
		sum = (num1 + num2 + carry) % 10;
		carry = (num1 + num2 + carry) / 10;
		results.insert(0, to_string(sum));
	}
	if (carry == 1)
		results.insert(0, "1");
	cout << results << endl;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/XindiOntheWay/article/details/84968626