• 算法题基础之数学篇


    1. 最大公约数

    题目描述

    输入两个正整数,求其最大公约数。

    假如输入

    /*
    测试数据有多组,每组输入两个正整数
    */
    49 14
    

    应当输出

    /*
    对于每组输入,请输出其最大公约数。 
    */
    7
    
    #include<stdio.h>
     int main(){
        int a,b;
        while(scanf("%d%d",&a,&b)!=EOF){
            while(b!=0){
                int temp = a%b;
                a = b;
                b = temp;
            }
            printf("%d
    ",a);
        }
     }
    

    2. 最小公倍数

    题目描述

    给定两个正整数,计算这两个数的最小公倍数。

    假如输入

    /*
    输入包含多组测试数据,每组只有一行,包括两个不大于 1000 的正整数。
    */
    10 14
    

    应当输出

    /*
    对于每个测试用例,给出这两个数的最小公倍数,每个实例输出一行。 
    */
    70
    
    
    

    3. 素数判定

    题目描述

    给定一个数 n,要求判断其是否为素数(0,1,负数都是非素数)。

    假如输入

    /*
    测试数据有多组,每组输入一个数 n。
    */
    13 
    

    应当输出

    /*
    对于每组输入,若是素数则输出 yes,否则输入 no。 
    */
    yes
    
    #include<stdio.h>
    int issushu(int x){
        if(x==1)
            return 0;
        for(int i=2;i<x;i++){
            if(x%i==0)
                return 0;
        }
        return 1;
    }
    
     int main(){
        int n;
        while(scanf("%d",&n)!=EOF){
            if(issushu(n))
                printf("yes
    ");
            else
                printf("no
    ");
        }
        return 0;
     }
    

    4. 素数

    题目描述

    输入一个整数 n(2<=n<=10000),要求输出所有从 1 到这个整数之间(不包括
    1 和这个整数)个位为 1 的素数,如果没有则输出-1。

    假如输入

    /*
    输入有多组数据。 
    每组一行,输入 n。
    */
    100
    

    应当输出

    /*
    输出所有从 1 到这个整数之间(不包括 1 和这个整数)个位为 1 的素数(素数之
    间用空格隔开,最后一个素数后面没有空格),如果没有则输出-1。
    */
    11 31 41 61 71
    
    
    

    5. 质因数的个数

    题目描述

    求正整数 N(N>1)的质因数的个数。
    相同的质因数需要重复计算。如 120=22235,共有 5 个质因数。

    假如输入

    /*
    可能有多组测试数据,每组测试数据的输入是一个正整数 N,(1<N<10^9)。
    */
    120
    

    应当输出

    /*
    对于每组数据,输出 N 的质因数的个数。
    提示:1 不是 N 的质因数;若 N 为质数,N 是 N 的质因数。
    */
    5
    
    
    

    6. 整除问题

    题目描述

    给定 n,a 求最大的 k,使 n!可以被 a^k 整除但不能被 a^(k+1)整除。

    假如输入

    /*
    两个整数 n(2<=n<=1000),a(2<=a<=1000) 
    */
    6 10
    

    应当输出

    /*
    一个整数.  
    */
    1
    
    
    

    7. 进制转换

    题目描述

    将 M 进制的数 X 转换为 N 进制的数输出。

    假如输入

    /*
    输入的第一行包括两个整数:M 和 N(2<=M,N<=36)。 
    下面的一行输入一个数 X,X 是 M 进制的数,现在要求你将 M 进制的数 X
    转换成 N 进制的数输出。  
    */
    16 10 
    F
    

    应当输出

    /*
    输出 X 的 N 进制表示的数。 
    提示:输入时字母部分为大写,输出时为小写。
    */
    15
    
    
    

    8. 百鸡问题

    题目描述

    用小于等于 n 元去买 100 只鸡,大鸡 5 元/只,小鸡 3 元/只,还有 1/3 元每只
    的一种小鸡,分别记为 x 只,y 只,z 只。编程求解 x,y,z 所有可能解。

    假如输入

    /*
    测试数据有多组,输入 n。 
    */
    40 
    

    应当输出

    /*
    对于每组输入,请输出 x,y,z 所有可行解,按照 x,y,z 依次增大的顺序输出。 
    */
    x=0,y=0,z=100 
    x=0,y=1,z=99 
    x=0,y=2,z=98 
    x=1,y=0,z=99
    
    
    

    9. N 阶楼梯上楼问题

    题目描述

    N 阶楼梯上楼问题:一次可以走两阶或一阶,问有多少种上楼方式。(要求
    采用非递归)

    假如输入

    /*
    输入包括一个整数 N,(1<=N<90)。
    */
    4
    

    应当输出

    /*
    可能有多组测试数据,对于每组数据,输出当楼梯阶数是 N 时的上楼方式
    个数。 
    */
    5
    
    
    

    10. 不容易系列之一

    题目描述

    HDU 有个网名叫做 8006 的男性同学,结交网友无数,最近该
    同学玩起了浪漫,同时给 n 个网友每人写了一封信,这都没什么,要命的是,他
    竟然把所有的信都装错了信封!注意了,是全部装错哟!现在的问题是:请大家
    帮可怜的 8006 同学计算一下,一共有多少种可能的错误方式呢?

    假如输入

    /*
    输入数据包含多个多个测试实例,每个测试实例占用一行,每行包含一个正
    整数 n(1<n<=20),n 表示 8006 的网友的人数。
    */
    2 
    3
    

    应当输出

    /*
    对于每行输入请输出可能的错误方式的数量,每个实例的输出占用一行。
    */
    1 
    2
    
    
    

    11. 拦截导弹

    题目描述

    某国为了防御敌国的导弹袭击,开发出一种导弹拦截系统。但是这种导弹拦
    截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发
    炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭,并观测到导
    弹依次飞来的高度,请计算这套系统最多能拦截多少导弹。拦截来袭导弹时,必
    须按来袭导弹袭击的时间顺序,不允许先拦截后面的导弹,再拦截前面的导弹。

    假如输入

    /*
    每组输入有两行, 
    第一行,输入雷达捕捉到的敌国导弹的数量 k(k<=25), 
    第二行,输入 k 个正整数,表示 k 枚导弹的高度,按来袭导弹的袭击时间顺
    序给出,以空格分隔。
    */
    8 
    300 207 155 300 299 170 158 65 
    

    应当输出

    /*
    每组输出只有一行,包含一个整数,表示最多能拦截多少枚导弹。 
    */
    6
    
    
    

    12. 寻找完数

    题目描述

    求1-n内的完数,所谓的完数是这样的数,它的所有因子相加等于它自身,比如6有3个因子1,2,3,1+2+3=6,那么6是完数。即完数是等于其所有因子(除了它自己)相加和的数。

    假如输入

    /*
    测试数据有多组,输入n,n数据范围不大。
    */
    6
    

    应当输出

    /*
    对于每组输入,请输出1-n内所有的完数。如有案例输出有多个数字,用空格隔开,输出最后不要有多余的空格。
    */
    6
    
    #include<stdio.h>
    int iswanshu(int x){
        int sum=0;
        for(int i=1;i<x;i++){
            if(x%i==0)
                sum+=i;
        }
        return sum==x;
    }
    
     int main(){
        int n;
        while(scanf("%d",&n)!=EOF){
            for(int i=1;i<=n;i++){
                if(iswanshu(i))
                    printf("%d ",i);
            }
        }
        return 0;
     }
    

    13. 判定一个数是否有一个不为1的完全平方数因子

    题目描述

    给定一个数n,判定它是否有一个不为1的完全平方数因子。也就是说,是否存在某个k,k>1,使得k*k能够整除n。

    假如输入

    /*
    每行一个整数n,1<n<10000
    */
    15
    12
    0
    

    应当输出

    /*
    对于每一个输入的整数,在单独的一行输出结果,如果有不为1的完全平方数因子,则输出Yes,否则输出No。请注意大小写。
    */
    No
    Yes
    
    #include<stdio.h>
    
    int ishave(int n){
        for(int i=1;i<n;i++){
            if(i*i%n==0)
                return 1;
        }
        return 0;
    }
    
    int main()
    {
        int n;
        while(scanf("%d",&n)!=EOF){
            if(ishave(n))
                printf("Yes
    ");
            else
                printf("No
    ");
        }
        return 0;
    }
    
    

    14. 素数

    题目描述

    输入一个整数 n(2<=n<=10000),要求输出所有从 1 到这个整数之间(不包括
    1 和这个整数)个位为 1 的素数,如果没有则输出-1。

    假如输入

    /*
    输入有多组数据。 
    每组一行,输入 n。
    */
    100
    

    应当输出

    /*
    输出所有从 1 到这个整数之间(不包括 1 和这个整数)个位为 1 的素数(素数之
    间用空格隔开,最后一个素数后面没有空格),如果没有则输出-1。
    */
    11 31 41 61 71
    
    
    

    15. 位数之和

    题目描述

    对于给定的正整数 n,计算其十进制形式下所有位置数字之和,并计算其平方的各位数字之和。

    假如输入

    /*
    每行输入数据包括一个正整数n(0<n<40000)
    */
    4
    12
    97
    39999
    

    应当输出

    /*
    对于每个输入数据,计算其各位数字之和,以及其平方值的数字之和,输出在一行中,之间用一个空格分隔,但行末不要有空格。
    */
    4 7
    3 9
    16 22
    39 36
    
    #include<stdio.h>
    #include<algorithm>
    using namespace std;
    
    void calsum(int n){
        int sum1=0;
        int sum2=0;
        int temp = n*n;
        while(n!=0){
            sum1+=n%10;
            n = n/10;
        }
        while(temp!=0){
            sum2+=temp%10;
            temp = temp/10;
        }
        printf("%d %d
    ",sum1,sum2);
    }
    
    int main()
    {
        int n;
        while(scanf("%d",&n)!=EOF){
            calsum(n);
        }
        return 0;
    }
    

    16. 素数

    题目描述

    输入一个整数 n(2<=n<=10000),要求输出所有从 1 到这个整数之间(不包括
    1 和这个整数)个位为 1 的素数,如果没有则输出-1。

    假如输入

    /*
    输入有多组数据。 
    每组一行,输入 n。
    */
    100
    

    应当输出

    /*
    输出所有从 1 到这个整数之间(不包括 1 和这个整数)个位为 1 的素数(素数之
    间用空格隔开,最后一个素数后面没有空格),如果没有则输出-1。
    */
    11 31 41 61 71
    
    
    

    17. 素数

    题目描述

    输入一个整数 n(2<=n<=10000),要求输出所有从 1 到这个整数之间(不包括
    1 和这个整数)个位为 1 的素数,如果没有则输出-1。

    假如输入

    /*
    输入有多组数据。 
    每组一行,输入 n。
    */
    100
    

    应当输出

    /*
    输出所有从 1 到这个整数之间(不包括 1 和这个整数)个位为 1 的素数(素数之
    间用空格隔开,最后一个素数后面没有空格),如果没有则输出-1。
    */
    11 31 41 61 71
    
    
    
  • 相关阅读:
    子网掩码
    一个正则表达式:该正则表达式标示了后面有数字,但又不能是某特定数字的情况
    C++:STL标准入门汇总
    SOAP
    uva10236The Fibonacci Primes
    uvalive3209City Game
    uvalive3695Distant Galaxy
    uva11549Calculator Conundrum
    uva11078Open Credit System
    uvalive3295Counting Triangles
  • 原文地址:https://www.cnblogs.com/lwp-nicol/p/14271122.html
Copyright © 2020-2023  润新知