本题要求两个给定正整数的最大公约数和最小公倍数。
输入格式:
输入在一行中给出两个正整数M和N(≤1000)。
输出格式:
在一行中顺序输出M和N的最大公约数和最小公倍数,两数字间以1空格分隔。
输入样例:
511 292
输出样例:
73 2044
#include
int main() {
int x, y, t, a, b;
scanf("%d %d", &x, &y);
a = x, b = y;
while (b != 0) {
t = a % b;
a = b;
b = t;
}
int cnt = 2;
if (x % y == 0 || y % x == 0) {
if (x > y) x = x;
else x = y;
} else {
while (1) {
if ((cnt * x) % y == 0) {
x = x * cnt;
break;
}
cnt++;
}
}
printf("%d %d", a, x);
return 0;
}
说明:
__gcd。本题要求计算给定的一系列正整数中奇数的和。
输入格式:
输入在一行中给出一系列正整数,其间以空格分隔。当读到零或负整数时,表示输入结束,该数字不要处理。
输出格式:
在一行中输出正整数序列中奇数的和。
输入样例:
8 7 4 3 70 5 6 101 -1
输出样例:
116
#include
int main() {
int x;
int sum = 0;
scanf("%d", &x);
while (x > 0) {
if (x % 2 != 0) sum = sum + x;
scanf("%d", &x);
}
printf("%d", sum);
return 0;
}
本题要求编写程序,找出给定一系列整数中的最小值。
输入格式:
输入在一行中首先给出一个正整数n,之后是n个整数,其间以空格分隔。
输出格式:
在一行中按照“min = 最小值”的格式输出n个整数中的最小值。
输入样例:
4 -2 -123 100 0
输出样例:
min = -123
#include
int main() {
int n;
scanf("%d", &n);
int cnt = 1;
int a;
scanf("%d", &a);
int x;
if (n == 1) printf("min = %d", a);
else {
while (cnt <= n - 1) {
scanf("%d", &x);
if (a <= x) a = a;
else a = x;
cnt++;
}
printf("min = %d", a);
}
return 0;
}
对于给定的正整数N,求它的位数及其各位数字之和。
输入格式:
输入在一行中给出一个不超过
1
0
9
10^9
109
的正整数N。
输出格式:
在一行中输出N的位数及其各位数字之和,中间用一个空格隔开。
输入样例:
321
输出样例:
3 6
#include
int main() {
int N;
scanf("%d", &N);
int cnt = 0;
int sum = 0;
while (N != 0) {
int y;
y = N % 10;
N = N / 10;
sum = sum + y;
cnt++;
}
printf("%d %d", cnt, sum);
return 0;
}
在中国数学史上,广泛流传着一个“韩信点兵”的故事:韩信是汉高祖刘邦手下的大将,他英勇善战,智谋超群,为汉朝建立了卓越的功劳。据说韩信的数学水平也非常高超,他在点兵的时候,为了知道有多少兵,同时又能保住军事机密,便让士兵排队报数:
请编写程序计算韩信至少有多少兵。
输入格式:
本题无输入
输出格式:
输出韩信至少拥有的士兵人数。
#include
int main() {
int cnt = 1;
for (cnt = 1;; cnt++) {
if (cnt % 5 == 1 && cnt % 6 == 5 && cnt % 7 == 4 && cnt % 11 == 10) break;
}
printf("%d", cnt);
return 0;
}
本题要求编写程序,计算序列 2/1+3/2+5/3+8/5+… 的前N项之和。注意该序列从第2项起,每一项的分子是前一项分子与分母的和,分母是前一项的分子。
输入格式:
输入在一行中给出一个正整数N。
输出格式:
在一行中输出部分和的值,精确到小数点后两位。题目保证计算结果不超过双精度范围。
输入样例:
20
输出样例:
32.66
#include
int main() {
int N;
scanf("%d", &N);
int cnt = 1;
double sum = 0;
double a, b;
a = 1;
b = 2;
while (cnt <= N) {
double t;
sum = sum + b / a;
t = b;
b = a + b;
a = t;
cnt++;
}
printf("%.2f", sum);
return 0;
}
给定两个均不超过9的正整数a和n,要求编写程序求a+aa+aaa++⋯+aa⋯a(n个a)之和。
输入格式:
输入在一行中给出不超过9的正整数a和n。
输出格式:
在一行中按照“s = 对应的和”的格式输出。
输入样例:
2 3
输出样例:
s = 246
#include
#include
int main() {
int a, n, x, sum = 0, m;
scanf("%d %d", &a, &n);
x = pow(10, n);
m = a;
while (a < x) {
sum = sum + a;
a = 10 * a + m;
}
printf("s = %d", sum);
return 0;
}
本题要求编写程序,计算序列部分和 1 - 1/4 + 1/7 - 1/10 + … 直到最后一项的绝对值不大于给定精度eps。
输入格式:
输入在一行中给出一个正实数eps。
输出格式:
在一行中按照“sum = S”的格式输出部分和的值S,精确到小数点后六位。题目保证计算结果不超过双精度范围。
输入样例1:
4E-2
输出样例1:
sum = 0.854457
输入样例2:
0.02
输出样例2:
sum = 0.826310
#include
#include
int main() {
double eps, sum = 0;
double x = 1;
scanf("%lf", &eps);
if (eps >= 1) sum = 1;
else {
while (1 / (3 * x - 2) >= eps) {
sum = sum + pow(-1, x + 1) / (3 * x - 2);
x++;
}
}
printf("sum = %f", sum);
return 0;
}
猜数字游戏是令游戏机随机产生一个100以内的正整数,用户输入一个数对其进行猜测,需要你编写程序自动对其与随机产生的被猜数进行比较,并提示大了(“Too big”),还是小了(“Too small”),相等表示猜到了。如果猜到,则结束程序。程序还要求统计猜的次数,如果1次猜出该数,提示“Bingo!”;如果3次以内猜到该数,则提示“Lucky You!”;如果超过3次但是在N(>3)次以内(包括第N次)猜到该数,则提示“Good Guess!”;如果超过N次都没有猜到,则提示“Game Over”,并结束程序。如果在到达N次之前,用户输入了一个负数,也输出“Game Over”,并结束程序。
输入格式:
输入第一行中给出两个不超过100的正整数,分别是游戏机产生的随机数、以及猜测的最大次数N。最后每行给出一个用户的输入,直到出现负数为止。
输出格式:
在一行中输出每次猜测相应的结果,直到输出猜对的结果或“Game Over”则结束。
输入样例:
58 4
70
50
56
58
60
-2
输出样例:
Too big
Too small
Too small
Good Guess!
#include
int main() {
int rand_number, x, cnt = 1, N;
scanf("%d", &rand_number);
scanf("%d", &N);
while (cnt <= N) {
scanf("%d", &x);
if (x < 0) break;
if (x > rand_number) printf("Too big\n");
else if (x < rand_number) printf("Too small\n");
else if (x == rand_number) break;
cnt++;
}
if (x == rand_number && cnt <= N) {
if (cnt == 1)printf("Bingo!");
else if (cnt == 2 || cnt == 3)printf("Lucky You!");
else printf("Good Guess!");
} else if (x < 0 || cnt > N) printf("Game Over");
return 0;
}
说明:这是一个假随机数,相当于说你输入的第一个数字就是要猜的随机数。
一对兔子,从出生后第3个月起每个月都生一对兔子。小兔子长到第3个月后每个月又生一对兔子。假如兔子都不死,请问第1个月出生的一对兔子,至少需要繁衍到第几个月时兔子总数才可以达到N对?
输入格式:
输入在一行中给出一个不超过10000的正整数N。
输出格式:
在一行中输出兔子总数达到N最少需要的月数。
输入样例:
30
输出样例:
9
#include
int f(int x) {
if (x == 1 || x == 2) return 1;
else return f(x - 1) + f(x - 2);
}
int main() {
int n;
scanf("%d", &n);
int i = 1;
while (1) {
if (f(i) >= n) {
printf("%d", i);
break;
}
i++;
}
return 0;
}
说明:这就是一个斐波那契数列。
皮球从某给定高度自由落下,触地后反弹到原高度的一半,再落下,再反弹,……,如此反复。问皮球在第n次落地时,在空中一共经过多少距离?第n次反弹的高度是多少?
输入格式:
输入在一行中给出两个非负整数,分别是皮球的初始高度和n,均在长整型范围内。
输出格式:
在一行中顺序输出皮球第n次落地时在空中经过的距离、以及第n次反弹的高度,其间以一个空格分隔,保留一位小数。题目保证计算结果不超过双精度范围。
输入样例:
33 5
输出样例:
94.9 1.0
#include
#include
int main() {
long long height, n;
long long cnt = 2;
scanf("%lld %lld", &height, &n);
double a = height, b;
if (n == 1) printf("%.1f %.1f", (double) height, (double) height / 2);
else if (n > 1) {
while (cnt <= n) {
a = a + pow((double) 1 / 2, cnt - 2) * height;
b = pow((double) 1 / 2, cnt) * height;
cnt++;
}
printf("%.1f %.1f\n", a, b);
} else if (n == 0) printf("0.0 0.0");
return 0;
}
黑洞数也称为陷阱数,又称“Kaprekar问题”,是一类具有奇特转换特性的数。
任何一个各位数字不全相同的三位数,经有限次“重排求差”操作,总会得到495。最后所得的495即为三位黑洞数。所谓“重排求差”操作即组成该数的数字重排后的最大数减去重排后的最小数。(6174为四位黑洞数。)
例如,对三位数207:
以后会停留在495这一黑洞数。如果三位数的3个数字全相同,一次转换后即为0。
任意输入一个三位数,编程给出重排求差的过程。
输入格式:
输入在一行中给出一个三位数。
输出格式:
按照以下格式输出重排求差的过程:
序号: 数字重排后的最大数 - 重排后的最小数 = 差值
序号从1开始,直到495出现在等号右边为止。
输入样例:
123
输出样例:
1: 321 - 123 = 198
2: 981 - 189 = 792
3: 972 - 279 = 693
4: 963 - 369 = 594
5: 954 - 459 = 495
#include
int max(int x) {
int a, b, c;
a = x / 100;
b = x % 100 / 10;
c = x % 10;
if (a >= b && a >= c) {
if (b >= c) return 100 * a + 10 * b + c;
else return 100 * a + 10 * c + b;
} else if (b >= a && b >= c) {
if (a >= c) return 100 * b + 10 * a + c;
else return 100 * b + 10 * c + a;
} else if (c >= a && c >= b) {
if (a >= b) return 100 * c + 10 * a + b;
else return 100 * c + 10 * b + a;
}
}
int min(int x) {
int a, b, c;
a = x / 100;
b = x % 100 / 10;
c = x % 10;
if (a >= b && a >= c) {
if (b >= c) return 100 * c + 10 * b + a;
else return 100 * b + 10 * c + a;
} else if (b >= a && b >= c) {
if (a >= c) return 100 * c + 10 * a + b;
else return 100 * a + 10 * c + b;
} else if (c >= a && c >= b) {
if (a >= b) return 100 * b + 10 * a + c;
else return 100 * a + 10 * b + c;
}
}
int main() {
int m;
int cnt = 1;
scanf("%d", &m);
int a;
if (m == 495)printf("1: 954 - 459 = 495");
while (m != 495) {
a = m;
m = max(m) - min(m);
printf("%d: %d - %d = %d\n", cnt, max(a), min(a), max(a) - min(a));
cnt++;
}
return 0;
}