zoukankan      html  css  js  c++  java
  • (noi.openjudge.cn) 1.5编程基础之循环控制T36——T45

    T36 计算多项式的值

    描述

    假定多项式的形式为xn+xn-1+…+x2+x+1,请计算给定单精度浮点数x和正整数n值的情况下这个多项式的值。

    输入

    输入仅一行,包括x和n,用单个空格隔开。x在float范围内,n <= 1000000。

    输出

    输出一个实数,即多项式的值,精确到小数点后两位。保证最终结果在float范围内。

    样例输入
    2.0 4
    样例输出
    31.00
    样例
     1 #include<iostream>
     2 #include<cmath>
     3 #include<cstdio>
     4 using namespace std;
     5 float x,ans;
     6 int n;
     7 int main()
     8 {
     9     cin>>x>>n;
    10     for(int i=n;i>=0;i--)
    11      ans+=pow(x,i);
    12     printf("%.2f",ans);
    13 } 
    View Code

    T37 雇佣兵

    描述

    雇佣兵的体力最大值为M,初始体力值为0、战斗力为N、拥有X个能量元素。

    当雇佣兵的体力值恰好为M时,才可以参加一个为期M天的战斗期,战斗期结束体力值将为0。在同一个战斗期内,雇佣兵每连续战斗n天,战斗力就会上升1点,n为当前战斗期开始时的战斗力。

    一个战斗期结束后,雇佣兵需要用若干个能量元素使其体力恢复到最大值M,从而参加下一个战斗期。每个能量元素恢复的体力值不超过当前的战斗力。每个能量元素只能使用一次。

    请问:雇佣兵的战斗力最大可以到达多少。

    输入

    一行包括三个整数M、N、X,相邻两个整数之间用单个空格隔开。M、N、X均为不超过10000的正整数。

    输出

    输出一个整数,为雇佣兵的最大战斗力。

    样例输入
    5 2 10
    样例输出
    6
    样例

    当精力n大于体力最大值m时,连续战斗n天的条件不能达到,所以循环条件是当前精力<=m&&x>0

     1 #include<cstdio>
     2 #include<iostream>
     3 #include<cmath>
     4 using namespace std;
     5 int n,m,x,engry;
     6 int main()
     7 {
     8     scanf("%d%d%d",&m,&n,&x);
     9     engry=n;//engry代表当前战斗力 
    10     while(engry<=m&&x)
    11     {
    12         x-=ceil(double (m)/engry);
    13         if(x<0) break;
    14         engry+=floor(double (m)/engry);
    15     }
    16     cout<<engry;
    17 }
    View Code

    T38 计算多项式的导数

    描述

    计算多项式的导函数是一件非常容易的任务。给定一个函数f(x),我们用f'(x)来表示其导函数。我们用x^n来表示x的n次幂。为了计算多项式的导函数,你必须知道三条规则:

    (1)、(C)' = 0 如果C是常量

    (2)、(C*x^n)' = C*n*x^(n-1) 如果n >= 1且C是常量

    (3)、(f1(x)+f2(2))' = f1'(x)+f2'(x)

    容易证明,多项式的导函数也是多项式。

    现在,请你编写一个程序,给定一个不包含负系数且已合并好同幂次项的多项式f(x),计算出它的导函数。

    输入

    输入有两行。
    第一行是一个整数n(0 <= n <= 100)表明多项式的最高次幂为n。
    第二行包含n+1个非负整数,Cn ,Cn-1 ,Cn-2 ,Cn-3 ,Cn-4 ,… ,C1,C0(0 <= Ci <= 1000)且Cn != 0。Ci是幂次为i的项的系数。

    输出

    在一行内输出f'(x)的结果。
    (1) 如果g(x) = 0那么直接输出0
    (2) 如果g(x)形如Cm(x^m)+Cm-1(x^(m-1))+…+C0(Cm!=0)那么输出Cm…C0
    (3) 相邻整数之间有单个空格。

    样例输入
    3
    0
    10
    2
    3 2 1
    3
    10 0 1 2
    样例输出
    0
    6 2
    30 0 1
    样例

    首先解释一下,本题样例输入输出有误,样例中的意思是第一行输入有几组数据,然后在按照题目中所说的输入,但实际测试数据中是按照题目描述设计的,即

    输入      输出
    测试点1:

    0
    10 ====> 0

    测试点2:

    2
    3 2 1 ====> 6 2

    测试点3:

    3
    10 0 1 2 ====> 30 0 1

    然后这道题虽然是如此高大上的导数背景,但看输出格式只输出多项式的系数就是c*n(n从初始值依次递减至1).

    以测试数据2为例:输入2,有n+1项,输入3 2 1,即求(3x³+2x²+1)的导数,

    0.n若为0,根据规则1,直接输出0

    1.根据规则3(f1(x)+f2(x))' = f1'(x)+f2'(x),所以原式的导数=3x²的导数+2x²的导数+1的导数

    2.根据规则1和2:所以1中的式子=3*2*x的1次方+2*1*x的0次方+0

    3.观察样例可以得到,最后一个0不输出,所以输出的数就是输入的每个c依次乘n(n每次减1)

     1 #include<cstdio>
     2 using namespace std;
     3 int n,c;
     4 int main()
     5 {
     6     scanf("%d",&n);
     7     if(!n)
     8     {
     9         printf("0");
    10         return 0;
    11     }
    12     for(int i=n;i>0;i--)
    13     {
    14         scanf("%d",&c);
    15         printf("%d ",c*i);
    16     } 
    17 } 
    View Code

     T39 与7无关的数

    描述

    一个正整数,如果它能被7整除,或者它的十进制表示法中某一位上的数字为7,则称其为与7相关的数.现求所有小于等于n(n < 100)的与7无关的正整数的平方和.

    输入

    输入为一行,正整数n(n < 100)

    输出

    输出一行,包含一个整数,即小于等于n的所有与7无关的正整数的平方和。

    样例输入
    21
    样例输出
    2336
    样例
     1 #include<cstdio>
     2 #include<iostream>
     3 using namespace std;
     4 int n,s;
     5 int main()
     6 {
     7     cin>>n;
     8     for(int i=1;i<=n;i++)
     9     {
    10         if(i%7==0) continue;
    11         if(i%10==7) continue;
    12         if(i/10==7) continue;
    13         s+=i*i;
    14     } 
    15     cout<<s;
    16 } 
    View Code

    T40 数1的个数

    描述

    给定一个十进制正整数n,写下从1到n的所有整数,然后数一下其中出现的数字“1”的个数。

    例如当n=2时,写下1,2。这样只出现了1个“1”;当n=12时,写下1,2,3,4,5,6,7,8,9,10,11,12。这样出现了5个“1”。

    输入

    正整数n。1 <= n <= 10000。

    输出

    一个正整数,即“1”的个数。

    统计某个数出现了几次,可以每次%10(不要改变原数)判断它的末尾数是不是指定数,然后/10(改变原数),直至原数=0

    样例输入
    12
    样例输出
    5
    样例
     1 #include<cstdio>
     2 #include<iostream>
     3 using namespace std;
     4 int n,s;
     5 int main()
     6 {
     7     cin>>n;
     8     for(int i=1;i<=n;i++)
     9     {
    10         int k=i;
    11         while(k)
    12         {
    13             if(k%10==1) s++;
    14             k/=10;
    15         }
    16     } 
    17     cout<<s;
    18 } 
    View Code

    T41 数字统计

    描述

    请统计某个给定范围[L, R]的所有整数中,数字2出现的次数。

    比如给定范围[2, 22],数字2在数2中出现了1次,在数12中出现1次,在数20中出现1次,在数21中出现1次,在数22中出现2次,所以数字2在该范围内一共出现了6次。

    输入

    输入共 1 行,为两个正整数 L 和 R,之间用一个空格隔开。

    输出

    输出共 1 行,表示数字 2 出现的次数。

    样例输入
    样例 #12 22
    
    样例 #22 100
    样例输出
    样例 #16
    
    样例 #220
    样例

    思路与T40一样

     1 #include<cstdio>
     2 #include<iostream>
     3 using namespace std;
     4 int n,s,m;
     5 int main()
     6 {
     7     cin>>n>>m;
     8     for(int i=n;i<=m;i++)
     9     {
    10         int k=i;
    11         while(k)
    12         {
    13             if(k%10==2) s++;
    14             k/=10;
    15         }
    16     } 
    17     cout<<s;
    18 } 
    View Code

    T42 画矩形

    描述

    根据参数,画出矩形。

    输入

    输入一行,包括四个参数:前两个参数为整数,依次代表矩形的高和宽(高不少于3行不多于10行,宽不少于5列不多于10列);第三个参数是一个字符,表示用来画图的矩形符号;第四个参数为1或0,0代表空心,1代表实心。

    输出

    输出画出的图形。

    样例输入
    7 7 @ 0
    样例输出
    @@@@@@@
    @               @
    @               @
    @               @
    @               @
    @               @
    @@@@@@@
    样例
     1 #include<cstdio>
     2 #include<iostream>
     3 using namespace std;
     4 int n,m,p;
     5 char c;
     6 int main()
     7 {
     8     cin>>n>>m>>c>>p;
     9     if(p)
    10       for(int i=1;i<=n;i++)
    11        {
    12           for(int j=1;j<=m;j++) cout<<c;
    13           cout<<endl;
    14        }
    15     else
    16       for(int i=1;i<=n;i++)
    17       {
    18           for(int j=1;j<=m;j++)
    19             if(i==1||i==n||j==1||j==m) cout<<c;
    20             else cout<<' ';
    21           cout<<endl;
    22       }
    23 } 
    View Code

    T43 质因数分解

    描述

    已知正整数 n 是两个不同的质数的乘积,试求出较大的那个质数。

    输入

    输入只有一行,包含一个正整数 n。

    对于60%的数据,6 ≤ n ≤ 1000。
    对于100%的数据,6 ≤ n ≤ 2*10^9。

    输出

    输出只有一行,包含一个正整数 p,即较大的那个质数。

    样例输入
    21
    样例输出
    7
    样例

    根据唯一分解定理,若此题有答案,则输入数据满足有且只有一组质数相乘=n

    所以,i从2循环到根号n,如果n%i==0,则n/i为答案

    也就是说,n=质数a*质数b,n没有其他的分解

    证明:

    假设还有另外一组分解c*d

    那么c*d分解质因数的结果与a*b相同

    因为a、b是质数

    所以a*b分解质因数=a*b

    所以c=a,d=b

    所以只有一种分解

     1 #include<iostream>
     2 #include<cmath>
     3 using namespace std;
     4 int main()
     5 {
     6     int n;
     7     cin>>n;
     8     int t=sqrt(n);
     9     for(int i=2;i<=t;i++)
    10     {
    11         if(n%i==0) 
    12         {
    13             cout<<n/i;
    14             return 0;
    15         } 
    16     }
    17 }
    View Code

    T44 第n小质数

    描述

    输入一个正整数n,求第n小的质数。

    输入

    一个不超过10000的正整数n。

    输出

    第n小的质数。

    样例输入
    10
    样例输出
    29
    样例

    方法1:合数一定可以表示成一个比它小的质数的几倍,所以若一个数不能整除比它小的所有的质数,则这个数是质数。所以,若要找第n个质数,则可以第n-1个质数为起点开始,通过上述方法判断。测试耗时:431ms

     1 #include<iostream>
     2 using namespace std;
     3 int n,s;
     4 int p[10001];
     5 int pan(int t)
     6 {
     7     while(1)
     8     {
     9         bool ok=0;
    10         for(int i=1;i<=s;i++)//若它是质数,则不不能整除比它小的所有的质数 
    11          if(t%p[i]==0) 
    12          {
    13              ok=1;break;
    14          }
    15         if(ok) 
    16         {
    17             t++;continue;
    18         }
    19         return t;
    20     }
    21 }
    22 int main()
    23 {
    24     cin>>n;
    25     p[1]=2;s++;//s表示当前质数数目 
    26     for(int i=2;i<=n;i++)
    27     {
    28         int t=p[s]+1;//下一个质数的至少比上一个质数大1 
    29         int h=pan(t);//确定下一个质数 
    30         p[++s]=h;
    31     }
    32     cout<<p[n];
    33 }
    View Code1

    方法2:是对方法1的改进,方法1中是判断不能整除所有比它小的质数,结合根号n复杂度判断质数的原理,例:15=3*5,枚举到3时判断了一次,5时又判断了一次,造成重复判断。所以判断能否整除比它小的所有的质数,仅需判断到根号n即可

    #include<cstdio>
    #include<cmath>
    using namespace std;
    int n,s;
    int p[100001];
    int devide(double k)
    {
        int x=(int)k;
        for(int i=1;i<s;i++)
        {
            if(p[i]>=x)
            return i+1;//因为开平方后的数k强制转化成了整数x,实际上x比k小了,所以要+1 
        }
    }
    int main()
    {
        scanf("%d",&n);
        p[1]=2;p[2]=3;
        s=2;
        while(s<n)
        {
            int tmp=p[s];//上一个质数 
            s++;//当前要找的是第s个质数 
            while(1)
            {
                tmp++;//至少比上一个质数大1 
                bool ok=false;
                int test=devide(sqrt(tmp));//找到要判断的数开平方后处于哪两个质数之间 
                for(int i=1;i<=test;i++) 
                 if(tmp%p[i]==0)
                 {
                     ok=true;
                     break;
                 }
                if(ok) continue;
                p[s]=tmp;
                break;  
            }
        }
        printf("%d",p[n]);
    }
    View Code

     T45 金币

    描述

    国王将金币作为工资,发放给忠诚的骑士。第一天,骑士收到一枚金币;之后两天(第二天和第三天)里,每天收到两枚金币;之后三天(第四、五、六天)里,每天收到三枚金币;之后四天(第七、八、九、十天)里,每天收到四枚金币……这种工资发放模式会一直这样延续下去:当连续N天每天收到N枚金币后,骑士会在之后的连续N+1天里,每天收到N+1枚金币(N为任意正整数)。

    你需要编写一个程序,确定从第一天开始的给定天数内,骑士一共获得了多少金币。

    输入

    一个整数(范围1到10000),表示天数。

    输出

    骑士获得的金币数。

    样例输入
    6
    样例输出
    14
    样例
    #include<iostream>
    using namespace std;
    int n;
    int main()
    {
        cin>>n;
        int t=0,s=0,z=0;//t表示当前每天可以得到几枚金币,s表示当前金币总数,z表示当前总天数 
        while(1)
        {
            t++;
            if(t+z>n) break;
    //t=a既可以表示当前每天可以得到a枚金币,也可以表示得a枚金币的状态即将持续a天,注意是即将持续,也就是这a*a枚金币在这时还没有累积,而z是当前已经计算了的天数。当t+z>n时,也就是如果用a*a的当时累加,会使得到金币的天数>n,所以要break,通过后面的for循环一天一天的加。
            s+=t*t;//t*t为这t天一共可得的金币数
            z+=t;
        }
        for(int i=z+1;i<=n;i++) s+=t;//当上面t+z=n时,不会break,累加一次t*t,此时恰好得了n天的金币,z=n,for循环条件不满足,不执行。
        cout<<s;
    }
    View Code
  • 相关阅读:
    jquery获取当前时间比较日期
    php获取时间计算时间差
    计数查询统计
    jQuery选取所有复选框被选中的值并用Ajax异步提交数据
    在java中实现对access数据库的远程访问
    sublime快捷键
    局部变量和成员变量的区别
    常见的几种数组排序方法
    JVM的内存划分
    Java函数
  • 原文地址:https://www.cnblogs.com/TheRoadToTheGold/p/6154818.html
Copyright © 2011-2022 走看看