(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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM