練習題目錄
-
- 2122 分解質因數
- 2145 列印月份
- 2135 價錢統計
- 1922 乘法
- 1955 過欠判斷
- 1912 咖啡館
- 1915 西湖遊船
- 2113 丢失的數字
- 2149 字元串出現位置
本文列出了 51nod 中幾個比較有代表性的題目
2412 2089 2413 2414 2088 2091 2122 2145 2135 2118 2101 2119 2102 2112
1922 2121 2130 1956 2092 1911 1955 1959 1912 1915 2113 2114 2150 2153
2148 2149 1950
如需以上題目c語言代碼可私信我擷取
2122 分解質因數
題目:
請你幫小瓜将正整數n分解質因數,并從小到大輸出所有的質因數(如果一個質因數出現多次,則輸出多次)

解題:
#include <stdio.h>
int main(){
int n;
scanf("%d",&n);
for (int i=2;i<=n;i++){
while(n%i==0){
printf("%d\n",i);
n=n/i;
}
}
}
2145 列印月份
題目(有誤):
給你一個年份 y 和一個月份 m,請你按照樣例的格式列印出 y 年第 m 月的月曆。例如當 y=2015,m=1 時,2015 年 1 月的月曆列印效果就應該如下:
每一行為代表星期的字母,第一個字母的左邊沒有空格,兩個字母之間有三個空格分隔。接下來的幾行是第 m 月的日期,每一列的數都與本列的第一個字母左對齊,同一行的兩個日期之間要有若幹個空格分隔。
為了簡化題目的難度,輸入還會給出一個正整數 n(n<8),表示第 y 年的 1 月 1 日 是星期 n。例如 2015 1 4 的含義是要輸出 2015 年 1 月的月曆,2015 年 1 月 1 日是星期四
特别注意輸入的n表示y年1月1日是星期n,而不是m月1日
解題:
int main(){
int y,m,n;
scanf("%d%d%d",&y,&m,&n);
printf("S M T W T F S\n");
int e=(y%4==0 && y%100!=0 || y%400==0)?29:28;
int days[12]={31,e,31,30,31,30,31,31,30,31,30};
for(int i=0;i<n;++i){
printf(" ");
}
for(int i=1;i<=9;++i){
printf("%d ",i);
if((n+i)%7==0){
printf("\n");
}
}
for(int i=10;i<=days[m-1];++i){
printf("%d ",i);
if((n+i)%7==0){
printf("\n");
}
}
printf("\n");
}
2135 價錢統計
題目:
夏天到了,超市裡擺滿了各種各樣的應季水果。現在知道:西瓜的價錢是每斤 1.2 元;桃子的價格是每斤 3.5 元;葡萄的價格是每斤 4.5 元;蘋果的價錢是每斤 5 元。現在分别給出上述四種所購買的斤數(均不超過 20),請你編寫程式幫助售貨員阿姨計算并依次輸出顧客購買四種水果需要的錢數及總錢數
解題:
計算機通過 %.1f 可以讓浮點數保留 1 位小數輸出,但保留的是精讀為四舍六入五成雙,我們需要改為四舍五入
例如:
9.8249=9.82(小于5,舍掉), 9.82671=9.83(大于5進位)
9.8350=9.84(奇數進位), 9.8351=9.84(奇數進位)
9.8250=9.82(偶數舍棄), 9.82501=9.82(偶數舍棄)
#include <stdio.h>
int main(){
float m1,m2,m3,m4;
scanf("%f%f%f%f",&m1,&m2,&m3,&m4);
int t1,t2,t3,t4;
int sum=0;
// 強制讓小數點後第二位是5的數進位
t1=(int)((1.2*m1)*10+0.5);
t2=(int)((3.5*m2)*10+0.5);
t3=(int)((4.5*m3)*10+0.5);
t4=(int)((5.0*m4)*10+0.5);
printf("%.1f\n",t1/10.0);
printf("%.1f\n",t2/10.0);
printf("%.1f\n",t3/10.0);
printf("%.1f\n",t4/10.0);
sum=(int)((1.2*m1+3.5*m2+4.5*m3+5*m4)*10+0.5);
printf("%.1f\n",sum/10.0);
}
假設得出的數是9.251,強制過程為:
9.251 => 92.51 => 93.01 => 93 => 9.3
1922 乘法
題目:
給出三個整數a,b,c,請找出最小的進制K(2<=K<=16)使得a*b=c在K進制下成立。
比如a=11,b=10,c=110。那麼當K=2的時候 (11)2 ∗ (10)2 = (110)2 成立,當K=10的時候 (11)10 ∗ (10)10 = (110)10 也成立
解題:
函數 Getnum 是用來把其他進制的數轉化為10進制,在函數中還需要檢查輸入的數能不能是不是某一進制的數
#include <stdio.h>
#include <math.h>
int Getnum(int n,int m){ // m為進制
int count = 0; // 每次次方增加1
int sum = 0;
if (n%10 >= m){
return -1;
}else{
sum = n%10;
}
while(n){
n = n/10;
count++;
if (n%10 >= m){
return -1;
}else{
sum = sum + (n%10)*pow(m,count); //m的count次方乘某一位再加一起
}
}
return sum;
}
int main(){
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
int count = 0;
for(int i=2;i<=16;++i){
int s1 = Getnum(a,i);
int s2 = Getnum(b,i);
int s3 = Getnum(c,i);
if(s1*s2 == s3){
printf("%d\n",i);
count++;
break;
}
}
if (count == 0){
printf("0\n");
return 0;
}
}
1955 過欠判斷
題目:
如果a, b, c三個是整數,并且滿足a = bc,那麼就說a是b或者c的倍數;b和c是a的因子。 如果c不是1/-1, 那麼b就叫作a的完全因子。 對于偶數,都是2的倍數比如-4, 0, 2, 10;一個完美數是一個正整數,并且它等于所有正完全因子之和;比如6,等于1 + 2 + 3,而28,等于1 + 2 + 4 + 7 + 14,都是完美數。而一個不是完美的正整數要麼是過數,要麼是欠數;取決于正完全因子之和與該數字比較的結果。比如9的正完全因子是1, 3,1+4〈9,是以9是 欠數;而12,正完全因子是1, 2, 3, 4, 6,這些數字之和>12,是以12是過數。 給定一個正整數,判斷它是完美數,過數還是欠數
解題:
func函數用來找除了輸入數本身的其他因子,并累加
#include <stdio.h>
int func(int a){
int b=0;
for(int i=1;i<a;++i){
if(a%i == 0){
b=b+i;
}
}
return b;
}
int main(){
int n;
scanf("%d",&n);
int arr[n];
for(int i=0;i<n;++i){
scanf("%d",&arr[i]);
}
for(int i=0;i<n;++i){
int sum = func(arr[i]);
if(sum>arr[i]){
printf("G\n");
}else if(sum<arr[i]){
printf("Q\n");
}else{
printf("E\n");
}
}
}
1912 咖啡館
題目:
Noder咖啡館裡面有N個座位,每天會有若幹個顧客來店裡面消費,會得到相應的服務。一個顧客占一個位置,顧客離開之後位置就會空出來。如果顧客來了之後沒有位置,那麼顧客就會直接離開,也就得不到服務。
現在已知座位數N,以及一天之内顧客來走的順序,請統計一下有多少顧客沒有得到服務
解題:
#include <stdio.h>
int main(){
int res; // 剩餘座位數
scanf("%d",&res);
char str[100]; // 來回人情況
scanf("%s",str);
int flag[30]={0}; // 标記某個人是否來過
int cnt=0; // 統計未接受到服務的人
int c=0; // 字母位置
for(int i=0;str[i]!='\0';++i){
c=str[i]-'A'+1;
if(!flag[c] && res>=1){
flag[c]=1; // 來了标記為1
--res;
}else if(!flag[c] && res==0){
++cnt;
++i;
}else{
flag[c]=0; // 走了标記為0
++res;
}
}
printf("%d\n",cnt);
}
1915 西湖遊船
題目:
有n名遊客在西湖遊玩,現在他們要上船觀光。遊客編号1到n。船的最大承重為W。第i個人的重量為c[i]。現在有若幹次遊客上下船的操作,請統計一下整個過程中船所承受過的最大總重量是多少。
解題:
#include <stdio.h>
int main(){
int n; // 人數
scanf("%d",&n);
int a; // 動作次數
scanf("%d",&a);
int all; // 船承重總重量
scanf("%d",&all);
int arr[n]; // 記錄重量
for(int i=0;i<n;++i){
scanf("%d",&arr[i]);
}
int arr1[a]; // 記錄動作
for(int i=0;i<a;++i){
scanf("%d",&arr1[i]);
}
int flag[100]={0};
int sum=0;
int max=0;
for(int i=0;i<a;++i){
if(!flag[arr1[i]]){
flag[arr1[i]]=1;
sum=sum+arr[arr1[i]-1];
}else{
flag[arr1[i]]=0;
sum=sum-arr[arr1[i]-1];
}
if(sum>all){
printf("Oh, My God!\n");
return 0;
}
if(sum>max){
max=sum;
}
}
printf("%d\n",max);
}
2113 丢失的數字
題目:
給你m個1到n之間的整數,你能找出1到n中的哪些整數沒有出現嗎?
解題:
數組用于标記
#include <stdio.h>
int main(){
int n,m;
scanf("%d%d",&n,&m);
int arr[100000]={0};
int j;
for(int i=0;i<m;++i){
scanf("%d",&j);
arr[j]=1;
}
for(int i=1;i<=n;++i){
if(arr[i]==0){
printf("%d\n",i);
}
}
}
2149 字元串出現位置
題目:
給你兩個字元串,一個母串,一個子串,請你找出子串第一次在母串中出現的位置。如果子串沒有在母串中出現過,則輸出-1。
例如子串ab在母串dceab中第一次出現的位置是3,而子串abc則在dceab中沒有出現過。
解題:
count 用來對合貼的字元數,與 len2 作比較,c用來标記有沒有找到出現的位置
#include <stdio.h>
int main(){
char s1[10000];
char s2[10000];
scanf("%s %s",&s1,&s2);
int len2=0;
int c=0;
for(int i=0;s2[i]!='\0';++i){
++len2;
}
for(int i=0;s1[i]!='\0';++i){
int count=0;
for(int j=0;s2[j]!='\0';++j){
if(s2[j]==s1[i+j]){
++count;
}
}
if(count==len2){
printf("%d\n",i);
c=1;
break;
}
}
if(c==0){
printf("-1\n");
}
}