C语言PTA练习题(求倒序数,买汽水,求两个数的最大公因数,求N个数的最大公因数,回文数个数,分解质因子,十进制转换为R进制,波兰表达式)

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;
}
相关推荐
huapiaoy1 分钟前
Redis中数据类型的使用(hash和list)
redis·算法·哈希算法
liu_chunhai5 分钟前
设计模式(3)builder
java·开发语言·设计模式
姜学迁13 分钟前
Rust-枚举
开发语言·后端·rust
冷白白14 分钟前
【C++】C++对象初探及友元
c语言·开发语言·c++·算法
凌云行者19 分钟前
rust的迭代器方法——collect
开发语言·rust
It'sMyGo22 分钟前
Javascript数组研究09_Array.prototype[Symbol.unscopables]
开发语言·javascript·原型模式
鹤上听雷23 分钟前
【AGC005D】~K Perm Counting(计数抽象成图)
算法
睡觉然后上课33 分钟前
c基础面试题
c语言·开发语言·c++·面试
一叶祇秋35 分钟前
Leetcode - 周赛417
算法·leetcode·职场和发展
qing_04060340 分钟前
C++——继承
开发语言·c++·继承