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 }
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 }
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 }
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 }
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 }
T41 數字統計
描述
請統計某個給定范圍[L, R]的所有整數中,數字2出現的次數。
比如給定范圍[2, 22],數字2在數2中出現了1次,在數12中出現1次,在數20中出現1次,在數21中出現1次,在數22中出現2次,所以數字2在該范圍內一共出現了6次。
輸入
輸入共 1 行,為兩個正整數 L 和 R,之間用一個空格隔開。
輸出
輸出共 1 行,表示數字 2 出現的次數。

樣例輸入 樣例 #1: 2 22 樣例 #2: 2 100 樣例輸出 樣例 #1: 6 樣例 #2: 20
思路與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 }
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 }
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 }
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 }
方法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]); }
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; }