zoukankan      html  css  js  c++  java
  • PAT《数据结构学习与实验指导》实验项目集 2-05 2-06 2-07 2-08

    题目地址:here

    pat 2-05 求集合数据的均方差

    没什么可说的,大水题

     1 #include<cstdio>
     2 #include<cmath>
     3 int main()
     4 {
     5     int n;
     6     scanf("%d", &n);
     7     int data[n];
     8     double average = 0.0;
     9     for(int i = 0; i < n; i++)
    10     {
    11         scanf("%d", &data[i]);
    12         average += data[i];
    13     }
    14     average /= n;
    15     double variance = 0.0;
    16     for(int i = 0; i < n; i++)
    17     {
    18         variance += (average - data[i])*(average - data[i]);
    19     }
    20     variance = sqrt(variance/n);
    21     printf("%.5f", variance);
    22     return 0;
    23 }

    pat 2-06 数列求和

    从结果的最后一位开始计算,依次计算每一个十进制位,水题

     1 #include<cstdio>
     2 #include<stack>
     3 using namespace std;
     4 
     5 int main()
     6 {
     7     int num,times;
     8     scanf("%d%d", &num, &times);
     9     if(times == 0)printf("0");
    10     else
    11     {
    12         //从结果的最后一位开始计算,结果放入栈中
    13         stack<char> result;
    14         int carryBit = 0;//进位
    15         for(int i = times; i >=1 ;i--)
    16         {
    17             int tmp = num*i + carryBit;
    18             result.push(tmp%10 + '0');
    19             carryBit = tmp/10;
    20         }
    21         if(carryBit != 0)
    22             printf("%d", carryBit);
    23         while(result.empty() == false)
    24         {
    25             printf("%c", result.top());
    26             result.pop();
    27         }
    28     }
    29     return 0;
    30 }

    pat 2-07 素因子分解

    这是整数的素因子分解问题,一个整数n的素数因子不可能同时大于sqrt(n), 先用“埃拉托斯特尼筛法”计算出sqrt(n)以内的所有素数,然后再注逐一查看这些素数是否是n的素因子,要注意最后除完所有素因子后如果结果>1,这个数也是素因子

     1 //筛选法寻找n以内的素数,返回素数的个数
     2 int findPrime(const int n, int prime[])
     3 {
     4     int primeNum = 0;
     5     bool isPrime[n+1];//0表示是素数,1表示非素数
     6     memset(isPrime, 0, sizeof(isPrime));
     7     for(int i = 2; i <= n; i++)
     8         if(isPrime[i] == 0)
     9         {//所有素数的倍数都不是素数
    10             prime[primeNum++] = i;
    11             for(int k = 2, t; (t = i*k)<= n; k++)
    12                 isPrime[t] = 1;
    13         }
    14     return primeNum;
    15 }
    16 int main()
    17 {
    18     long N;
    19     scanf("%ld", &N);
    20     int *prime = new int[(int)sqrt(N)];
    21     int primeNum = findPrime(sqrt(N), prime);
    22     printf("%d=", N);
    23     if(N == 1)printf("1");
    24     bool isFirst = true;
    25     for(int i = 0; i < primeNum; i++)
    26     {
    27         int exp = 0;
    28         while(N % prime[i] == 0)
    29         {
    30             exp++;
    31             N = N / prime[i];
    32         }
    33         if(exp != 0)
    34         {
    35             if(isFirst == false)
    36                 printf("*");
    37             else isFirst = false;
    38             printf("%d", prime[i]);
    39             if(exp > 1)
    40                 printf("^%d", exp);
    41         }
    42     }
    43 
    44     if(N > 1)
    45     {
    46         if(isFirst == false)
    47             printf("*");
    48         printf("%d", N);
    49     }
    50     return 0;
    51 
    52 }

     pat 2-08 用扑克牌计算24点

    24点游戏请参考我的博客:here

    注意的是结果后面要加‘ ’,要不然会提示答案格式错误

    #include<cstdio>
    #include<iostream>
    #include<string>
    using namespace std;
    
    //cards[i]的值是通过表达式expr[i]计算而来
    bool GameRecur(double cards[], string expr[],
                   const int cardsNum, const int result)
    {
        if(cardsNum == 1)
        {
            if(cards[0] == result)
            {
                //cout<<expr[0]<<endl;
                return true;
            }
            else return false;
        }
        //从已有数中任选两个,计算得到中间结果,并且和剩余的数一起存在cards数组的前
        //cardsNum-1个位置
        for(int i = 0; i<cardsNum; i++)
        {
            for(int k  = i+1; k < cardsNum; k++)
            {
                double a = cards[i], b = cards[k];
                cards[k] = cards[cardsNum-1];
                string expra = expr[i], exprb = expr[k];
                expr[k] = expr[cardsNum-1];
    
                cards[i] = a + b;
                expr[i] = '(' + expra + '+' + exprb + ')';
                if(GameRecur(cards, expr, cardsNum-1, result))
                    return true;
    
                cards[i] = a - b;
                expr[i] = '(' + expra + '-' + exprb + ')';
                if(GameRecur(cards, expr, cardsNum-1, result))
                    return true;
    
                if(a != b)
                {
                    cards[i] = b - a;
                    expr[i] = '(' + exprb + '-' + expra + ')';
                    if(GameRecur(cards, expr, cardsNum-1, result))
                        return true;
                }
    
                cards[i] = a * b;
                expr[i] = '(' + expra + '*' + exprb + ')';
                if(GameRecur(cards, expr, cardsNum-1, result))
                    return true;
    
                if(b != 0)
                {
                    cards[i] = a / b;
                    expr[i] = '(' + expra + '/' + exprb + ')';
                    if(GameRecur(cards, expr, cardsNum-1, result))
                        return true;
                }
    
                if(a != 0 && a!= b)
                {
                    cards[i] = b / a;
                    expr[i] = '(' + exprb + '/' + expra + ')';
                    if(GameRecur(cards, expr, cardsNum-1, result))
                        return true;
                }
    
                //把选出来的两个数放回原位
                cards[i] = a;
                cards[k] = b;
                expr[i] = expra;
                expr[k] = exprb;
            }
        }
        return false;
    }
    
    string PointGame(int cards[], const int cardsNum, const int result)
    {
        string expr[cardsNum];
        double cardsCopy[cardsNum];
        for(int i = 0; i < cardsNum; i++)
        {
            char buf[30];
            sprintf(buf, "%d", cards[i]);
            expr[i] = buf;
            cardsCopy[i] = cards[i];
        }
        if(GameRecur(cardsCopy, expr, cardsNum, result))
            return expr[0].substr(1, expr[0].length()-2); //去掉最外层的括号
        else return "-1";
    }
    
    int main()
    {
        int a[4];
        for(int i = 0; i < 4; i++)
            scanf("%d", &a[i]);
        printf("%s
    ", PointGame(a,4,24).c_str());
        return 0;
    }
    

      

    【版权声明】转载请注明出处:http://www.cnblogs.com/TenosDoIt/p/3393183.html

  • 相关阅读:
    读《深入理解Elasticsearch》点滴-multi_match
    圈子
    读《深入理解Elasticsearch》点滴-查询二次评分
    读《深入理解Elasticsearch》点滴-查询分类
    读《深入理解Elasticsearch》点滴-过滤器
    读《深入理解Elasticsearch》点滴-查询模版(结合官网手册,版本5.1)
    EasyUI
    EasyUI
    EasyUI
    EasyUI
  • 原文地址:https://www.cnblogs.com/TenosDoIt/p/3393183.html
Copyright © 2011-2022 走看看