1. BC115
小乐乐最近在课上学习了如何求两个正整数的最大公约数与最小公倍数,
但是他竟然不会求两个正整数的最大公约数与最小公倍数之和,请你帮助他解决这个问题。
输入描述:每组输入包含两个正整数n和m。(1 ≤ n ≤ 109,1 ≤ m ≤ 109)
输出描述:对于每组输入,输出一个正整数,为n和m的最大公约数与最小公倍数之和。
思路:用辗转相除法求最大公约数。两个整数的乘积 = 他们的最大公约数 * 他们的最小公倍数
//方法一:
int main() {
int n = 0;
int m = 0;
int c = 0;
int d = 0;
while (scanf("%d %d", &n, &m) != EOF) {
d = m * n;//m*n会超出最大int
while (c = n % m) {
n = m;
m = c;
}
// 最大公约数是m
int e = d / m;
printf("%d\n", e + m);
}
return 0;
}
//方法二:
int main() {
long n = 0;
long m = 0;
while (scanf("%ld %ld", &n, &m) != EOF) {
long i = n;
long j = m;
long r = 0;
while (r = i % j) {
i = j;
j = r;
}
// 最大公约数是j
printf("%ld\n", (m*n/j)+j);
}
return 0;
}
//方法三
//算法复杂度过大
int main()
{
int n = 0;
int m = 0;
while (scanf("%d %d", &n, &m) == 2)
{
//最大公约数最大是两个数的较小数,用两个数分别除以较小数,较小数--,直到两个数都能整除为止
//最小公倍数最小是两个数的较大数,用较大数分别除以两个数,较大数++,直到能整除两个数为止
int min = n < m ? n : m;
int max = n > m ? n : m;
int i = min;//较小数
int j = max;//较大数
//最大公约数
while (1)
{
if (n % i == 0 && m % i == 0)
{
break;
}
i--;
}
//最小公倍数
while (1)
{
if (j % n == 0 && j % m == 0)
{
break;
}
j++;
}
printf("%d\n", i + j);
}
return 0;
}
2. BC69
KiKi学习了循环,BoBo老师给他出了一系列打印图案的练习,该任务是打印用"*"组成的“空心”正方形图案。
输入描述:多组输入,一个整数(3~20),表示输出的行数,也表示组成正方形边的"*"的数量。
输出描述:针对每行输入,输出用"*"组成的“空心”正方形,每个"*"后面有一个空格。
输入:4
输出:
* * * *
* *
* *
* * * *
思路:第一行和最后一行打印,第一列和最后一列打印
int main() {
int n = 0;
while (scanf("%d", &n) != EOF) {
int i = 0;
int j = 0;
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
if (j > 0 && j < n - 1 && i != 0 && i != n - 1)
printf(" ");
else
printf("* ");
//if (i == 0 || i == n - 1 || j == 0 || j == n - 1)
// printf("* ");
//else
// printf(" ");
}
printf("\n");
}
}
return 0;
}
3. BC65
KiKi学习了循环,BoBo老师给他出了一系列打印图案的练习,该任务是打印用"*"组成的箭形图案。
输入描述:本题多组输入,每行一个整数(2~20)。
输出描述:针对每行输入,输出用"*"组成的箭形。
输入:2
输出:
*
**
***
**
*
思路:
图案分为上下两个部分,上面是n行,下面是n+1行。
上半部分空格在减少,星星在增加;下半部分星星在增加,空格在减少
每一行的空格数量跟行数n有关系,所以可以把两个空格视为一组
//自己方法:
int main() {
int n = 0;
while (scanf("%d", &n) != EOF) {
int i = 0;
int j = 0;
// 上半部分
for (i = 0; i < n; i++) {
// 打印空格
for (j = 2 * n; j > 2 * i; j--) {
printf(" ");
}
// 打印星星
for (j = 0; j <= i; j++) {
printf("*");
}
// 换行
printf("\n");
}
// 打印中间
for (i = 0; i <= n; i++) {
printf("*");
}
printf("\n");
// 下半部分
for (i = 1; i <= n; i++) {
// 打印空格
for (j = 0; j < 2 * i; j++) {
printf(" ");
}
// 打印星星
for (j = n; j >= i; j--) {
printf("*");
}
printf("\n");
}
}
return 0;
}
//老师方法:
//图案分为上下两个部分,上面是n行,下面是n+1行。
//上半部分空格在减少,星星在增加;下半部分星星在增加,空格在减少
//每一行的空格数量跟行数n有关系,所以可以把两个空格视为一组
int main()
{
int n = 0;
while (scanf("%d", &n) != EOF)
{
//打印图案
//上n行
int i = 0;
for (i = 0; i < n; i++)
{
//打印空格
int j = 0;
for (j = 0; j < n - i; j++)
{
printf(" ");//将2个空格视为一组
}
//打印星星
for (j = 0; j <= i; j++)
{
printf("*");
}
//换行
printf("\n");
}
//下n+1行
for (i = 0; i < n + 1; i++)
{
//打印空格
int j = 0;
for (j = 0; j < i; j++)
{
printf(" ");//将2个空格视为一组
}
//打印星星
for (j = 0; j < n + 1 - i; j++)
{
printf("*");
}
//换行
printf("\n");
}
}
return 0;
}
4. BC76
公务员面试现场打分。有7位考官,从键盘输入若干组成绩,每组7个分数(百分制),去掉一个最高分和一个最低分,输出每组的平均成绩。
(注:本题有多组输入)
输入描述:每一行,输入7个整数(0~100),代表7个成绩,用空格分隔。
输出描述:每一行,输出去掉最高分和最低分的平均成绩,小数点后保留2位,每行输出后换行。
输入:99 45 78 67 72 88 60
输出:73.00
思路:一次读取一个数字,读够7个再处理
int main() {
int score = 0;
int max = 0;
int min = 100;
int n = 0;//计数器,监视输入数字的个数
int sum = 0;
while (scanf("%d", &score) != EOF) {
n++;
if (score > max) {
max = score;
}
if (score < min) {
min = score;
}
sum += score;
if (n == 7) {
printf("%.2lf\n", (sum - max - min) / 5.0);
// 重置数据,防止下次输入时当前变量中的数据干扰
max = 0;
min = 100;
n = 0;
sum = 0;
}
}
return 0;
}