作业题
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)
#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;
}