001:角谷猜想
- 總時間限制: 1000ms 內存限制: 65536kB
描述
- 所謂角谷猜想,是指對於任意一個正整數,如果是奇數,則乘3加1,如果是偶數,則除以2,得到的結果再按照上述規則重復處理,最終總能夠得到1。如,假定初始整數為5,計算過程分別為16、8、4、2、1。
程序要求輸入一個整數,將經過處理得到1的過程輸出來。
輸入
- 一個正整數N(N <= 2,000,000)
輸出
- 從輸入整數到1的步驟,每一步為一行,每一部中描述計算過程。最后一行輸出"End"。如果輸入為1,直接輸出"End"。
樣例輸入
- 5
樣例輸出
5*3+1=16
16/2=8
8/2=4
4/2=2
2/2=1
End
思考
AC
#include <iostream>
using namespace std;
int main(){
long long N; //注意范圍
scanf("%d",&N);
while (N != 1){
if (N%2 == 0){ //偶數
cout << N << "/2=" << N/2 << endl; //這題有毒,不能用printf()通過
N /= 2;
}else{
cout << N << "*3+1=" << N*3+1 << endl;
N = N*3+1;
}
}
printf("End\n");
return 0;
}
002:正常血壓
- 總時間限制: 1000ms 內存限制: 65536kB
描述
- 監護室每小時測量一次病人的血壓,若收縮壓在90 - 140之間並且舒張壓在60 - 90之間(包含端點值)則稱之為正常,現給出某病人若干次測量的血壓值,計算病人保持正常血壓的最長小時數。
輸入
- 第一行為一個正整數n,n < 100
- 其后有n行,每行2個正整數,分別為一次測量的收縮壓和舒張壓,中間以一個空格分隔。
輸出
- 輸出僅一行,血壓連續正常的最長小時數。
樣例輸入
4
100 80
90 50
120 60
140 90
樣例輸出
- 2
思考
- no
AC
#include <iostream>
int main(){
int i,n,sum=0,p,q,max=0;
scanf("%d",&n);
for(i=1;i<=n;i++){
scanf("%d %d",&p,&q);
if((p>=90&&p<=140)&&(q>=60&&q<=90)){
sum++; //正常則計數
if(sum>max){
max=sum; //記錄小時數
}
}else sum=0;
}
printf("%d\n",max);
return 0;
}
003:數字反轉
- 總時間限制: 1000ms 內存限制: 65536kB
描述
- 給定一個整數,請將該數各個位上數字反轉得到一個新數。新數也應滿足整數的常見形式,即除非給定的原數為零,否則反轉后得到的新數的最高位數字不應為零(參見樣例2)。
輸入
- 輸入共 1 行,一個整數N。
- -1,000,000,000 ≤ N≤ 1,000,000,000。
輸出
輸出共 1 行,一個整數,表示反轉后的新數。
樣例輸入
樣例 #1:
- 123
樣例 #2:
- -380
樣例輸出
樣例 #1:
- 321
樣例 #2:
- -83
AC
#include <iostream>
using namespace std;
int main(){
long long n,m=0;
scanf("%lld",&n);
if(n<0){
printf("-"); //輸出負號
n=-n; //取正
}
while(n!=0){
m=m*10+n%10; ////原數個位相當於新數最高位
n /= 10; //整除10,相當於刪除個位
}
printf("%lld\n",m);
return 0;
}
004:求特殊自然數
- 總時間限制: 1000ms 內存限制: 65536kB
描述
- 一個十進制自然數,它的七進制與九進制表示都是三位數,且七進制與九進制的三位數碼表示順序正好相反。編程求此自然數,並輸出顯示。
輸入
- 無。
輸出
- 三行:
- 第一行是此自然數的十進制表示;
- 第二行是此自然數的七進制表示;
- 第三行是此自然數的九進制表示。
樣例輸入
(無)
樣例輸出
(不提供)
思考
- 看到這道題,第一想法是數組,但又覺得太麻煩了,就打算試試直接弄,結果🆗
- 直接化七進制或九進制,先思考一下可能的七進制或九進制的三位數的范圍,最小的數是七進制的(101)7,最大是九進制的(666)9,
- 再根據題意“七進制與九進制的三位數碼表示順序正好相反”進行枚舉即可。
AC
#include <iostream>
using namespace std;
int main(){
int i,x,y,z;
for(i=100;i<667;i++){
x=i/100; //百位
y=i/10%10; //十位
z=i%100; //個位
if(x*7*7+y*7+z==z*9*9+y*9+x){
printf("%d\n",x*7*7+y*7+z);
printf("%d%d%d\n",x,y,z);
printf("%d%d%d\n",z,y,x);
}
}
return 0;
}
005:雇佣兵
- 總時間限制: 1000ms 內存限制: 65536kB
描述
- 雇佣兵的體力最大值為M,初始體力值為0、戰斗力為N、擁有X個能量元素。
- 當雇佣兵的體力值恰好為M時,才可以參加一個為期M天的戰斗期,戰斗期結束體力值將為0。在同一個戰斗期內,雇佣兵每連續戰斗n天,戰斗力就會上升1點,n為當前戰斗期開始時的戰斗力。
- 一個戰斗期結束后,雇佣兵需要用若干個能量元素使其體力恢復到最大值M,從而參加下一個戰斗期。每個能量元素恢復的體力值不超過當前的戰斗力。每個能量元素只能使用一次。
- 請問:雇佣兵的戰斗力最大可以到達多少。
輸入
- 一行包括三個整數M、N、X,相鄰兩個整數之間用單個空格隔開。M、N、X均為不超過10000的正整數。
輸出
- 輸出一個整數,為雇佣兵的最大戰斗力。
樣例輸入
- 5 2 10
樣例輸出
- 6
思考
- 體力的初始值是0,但是有能量元素,x>0,需要用能量元素恢復體力才能進行戰斗。因此可以用一個while循環
- 當體力達到最大值M時,就進行為期M天的戰斗。如果m>n,則n+=m/n,這時能量元素x-=m/n;如果m<n,直接輸出n。
- 戰斗結束后,體力值為0,用能量元素進行恢復。如果當前的能量元素小於所需的能量元素,即x<m/n,則直接輸出n。
- 一直循環,直到能量元素用完。
AC
#include <iostream>
using namespace std;
int main(){
int M,X,N,num=0;
scanf("%d %d %d",&M,&N,&X);//體力,戰斗力、能量元素
while(X>0){
if(M%N==0) //消耗能源元素
num=M/N;
else
num=M/N+1;
if(X<num) break;
X -= num;
N += M/N; //戰斗
}
printf("%d\n",N);
return 0;
}
006:數字統計
- 總時間限制: 1000ms 內存限制: 65536kB
描述
- 請統計某個給定范圍[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
思考
- 枚舉+取余+判斷
AC
#include <iostream>
using namespace std;
int main(){
int L,R,i,num=0,j;
scanf("%d %d",&L,&R);
for(i=L;i<=R;i++) //枚舉范圍
for(j=i;j>0;j=j/10)
if(j%10==2) num++; //判斷是否為2
printf("%d\n",num);
return 0;
}
第四周全部題解,🆗。