7-1 求倒序数
输入一个非负整数,输出这个数的倒序数。
例如输入123,输出321。
要求:用递归实现。
输入格式:
任意给定一个正整数n(1≤n≤1e9)。
输出格式:
n的倒序数。
输入样例:
在这里给出一组输入。例如:
123
输出样例:
在这里给出相应的输出。例如:
321
cpp
#include <stdio.h>
void reverse(int n) {
if (n < 10) {
printf("%d", n);
} else {
printf("%d", n % 10);
reverse(n / 10);
}
}
int main() {
int num;
scanf("%d", &num);
if(num%10!=0){
reverse(num);
}else{
while(1){
if(num%10==0){
num/=10;
}
if(num%10!=0){
break;
}
}
reverse(num);
}
return 0;
}
7-2 买汽水
一瓶汽水n元钱,两个空瓶换一瓶,有m元最多可以喝几瓶汽水?
要求:用递归完成。
输入格式:
两个整数n,m(1<=n<m<=100000)。
输出格式:
最多可以喝到的瓶数。
输入样例:
在这里给出一组输入。例如:
2 10
输出样例:
在这里给出相应的输出。例如:
9
cpp
#include<stdio.h>
#include<iostream>
using namespace std;
long sum(int x,int a){
if(a==1){
return 0;
}
return x+sum(a/2,a/2+a%2);
}
int main(){
long a,b;
cin>>a>>b;
printf("%ld",1+sum(b/a,b/a));
}
7-3 求两个数的最大公因数
输入两个正整数 m, n,求它们的最大公因数。
要求:用递归(辗转相除法)完成。
输入格式:
两个整数m, n(1<=n<m<=1e18)。
输出格式:
最大公因数。
输入样例:
在这里给出一组输入。例如:
8 12
输出样例:
在这里给出相应的输出。例如:
4
cpp
#include <stdio.h>
long long gcd(long long m, long long n) {
if (n == 0) {
return m;
}
return gcd(n, m % n);
}
int main() {
long long m, n;
scanf("%lld %lld", &m, &n);
long long result = gcd(m, n);
printf("%lld\n", result);
return 0;
}
7-4 求N个数的最大公因数
输入n个正整数,求它们的最大公因数。
输入格式:
输入2行,第1行一个正整数n(2<=n<=200),表示数的个数
第2行输入n个正整数(1<=正整数<=1e18),用空格分开。
输出格式:
n个数的最大公因数。
输入样例:
在这里给出一组输入。例如:
4
8 12 2000 24
输出样例:
在这里给出相应的输出。例如:
4
cpp
#include <stdio.h>
long long gcd(long long m, long long n) {
if (n == 0) {
return m;
}
return gcd(n, m % n);
}
int main() {
int n;
scanf("%d", &n);
long long numbers[n];
for (int i = 0; i < n; i++) {
scanf("%lld", &numbers[i]);
}
long long result = numbers[0];
for (int i = 1; i < n; i++) {
result = gcd(result, numbers[i]);
}
printf("%lld\n", result);
return 0;
}
7-5 回文数个数
一个正整数,正读和反读都相同的数为回文数。例如22,131,2442,37073,6,...所有1位数都是回文数。给出一个正整数n(1≤n≤1e6),求出1,2,...,n之中(包括1和n)的回文数的个数。
要求:求一个数的回文数的功能用递归实现。
输入格式:
任意给定一个正整数n(1≤n≤1e6)。
输出格式:
一个正整数,表示[1,n]之间的回文数的个数。
输入样例:
在这里给出一组输入。例如:
20
输出样例:
在这里给出相应的输出。例如:
10
cpp
#include <stdio.h>
int is_palindrome(int num, int original) {
if (num == 0) {
return original;
}
int digit = num % 10;
original = original * 10 + digit;
return is_palindrome(num / 10, original);
}
int palindromes(int n, int current) {
if (current > n) {
return 0;
}
int reversed = is_palindrome(current, 0);
int count = (reversed == current) ? 1 : 0;
return count + palindromes(n, current + 1);
}
int main() {
int n;
scanf("%d", &n);
int total_palindromes = palindromes(n, 1);
printf("%d\n", total_palindromes);
return 0;
}
7-6 分解质因子
输入一个正整数n,分解出它的全部质因子。
要求:用递归完成。
输入格式:
任意给定一个正整数n(1≤n≤1e9)。
输出格式:
n的全部质因子,从小到大依次输出。
如果n为质数,则输出它自己。
输入样例:
在这里给出一组输入。例如:
20
输出样例:
在这里给出相应的输出。例如:
2 2 5
cpp
#include <stdio.h>
int is(int num, int div) {
if (div == 1) {
return 1;
}
if (num % div == 0) {
return 0; // Not prime
}
return is(num, div - 1);
}
void pri(int num, int div) {
if (num == 1) {
return;
}
if (num % div == 0 && is(div, div - 1)) {
printf("%d ", div);
pri(num / div, div);
} else {
pri(num, div + 1);
}
}
int main() {
int n;
scanf("%d", &n);
pri(n, 2);
printf("\n");
return 0;
}
7-7 十进制转换为R进制
输入一个十进制正整数n,转换成任意R进制数。
超出十进制的数中,10~16分别是大写字母A~F表示。
要求:用递归完成。
输入格式:
一行,一个十进制正整数n(1≤n≤1e9)和要转换的进制R(R<=16),两个数用空格分开。
输出格式:
转换出的R进制数。
输入样例:
在这里给出一组输入。例如:
11 2
输出样例:
在这里给出相应的输出。例如:
1011
cpp
#include <stdio.h>
void decimalToR(int n, int R) {
if (n == 0) {
return;
}
decimalToR(n / R, R);
int remainder = n % R;
if (remainder < 10) {
printf("%d", remainder);
} else {
printf("%c", 'A' + remainder - 10);
}
}
int main() {
int n, R;
scanf("%d %d", &n, &R);
decimalToR(n, R);
printf("\n");
return 0;
}
7-8 波兰表达式
波兰表达式是一种把运算符前置的算术表达式,例如普通的表达式2 + 3的波兰表示法为+ 2 3。波兰表达式的优点是运算符之间不必有优先级关系,也不必用括号改变运算次序,例如(2 + 3) * 4的波兰表示法为* + 2 3 4。本题求解波兰表达式的值,其中运算符包括+ - * /四个。
要求:用递归完成。
输入格式:
输入为一行,其中运算符和运算数之间都用空格分隔,运算数是浮点数。
输出格式:
输出为一行,表达式的值(保留5位小数)。
输入样例:
在这里给出一组输入。例如:
* - 5 2.5 2.2
输出样例:
在这里给出相应的输出。例如:
5.50000
cpp
#include <stdio.h>
#include <stdlib.h>
double compute() {
char s[256];
scanf("%s", s);
switch(s[0]) {
case '+': {
return compute() + compute();
}
case '-': {
return compute() - compute();
}
case '*': {
return compute() * compute();
}
case '/': {
return compute() / compute();
}
default: {
return atof(s);
}
}
}
int main() {
double result = compute();
printf("%.5f\n", result);
return 0;
}