- 輸出“Hello World”(mooc第一周編程練習)
# 定義main函數,如果定義為 int型的函數,記得要有返回值0,如果定義為void則不需要返回值。
tip1:關於int main() 和 void main()
// 輸出“Hello World” #include<stdio.h> int main(){ printf("Hello World"); return 0; }
- 逆序的三位數(5分)(mooc第二周編程練習)
題目內容:
逆序的三位數:
程序每次讀入一個正三位數,然后輸出逆序的數字。注意,當輸入的數字含有結尾的0時,輸出不應帶有前導的0。比如輸入700,輸出應該是7。
提示:用%10可以得到個位數,用/100可以得到百位數...。將這樣得到的三個數字合起來:百位*100+十位*10+個位,就得到了結果。
注意:除了題目要求的輸出,不能輸出任何其他內容,比如輸入時的提示,輸出時的說明等等都不能。這道題目要求輸出逆序的數字,程序就只能輸出這個數字,除此之外任何內容都不能輸出。
輸入格式:
每個測試是一個3位的正整數。
輸出格式:
輸出逆序的數。
輸入樣例:
123
輸出樣例:
321
// 逆序三位數 #include <stdio.h> int main(){ int num, ones, tens, hundreds; scanf("%d", &num); ones = num%10; tens = (num-ones)%100/10; hundreds = (num-ones-tens)/100; printf("%d",ones*100+tens*10+hundreds); return 0; }
#逆序三位數利用數組方法解答
// 逆序三位數(數組) // %s和%d輸出結果相同? #include<stdio.h> int main(){ char a[3]; scanf("%s", a); for (int i=strlen(a)-1;i>=0;i--){ printf("%c", a[i]); } return 0; }
- 時間換算(5分) (mooc第三周編程練習)
題目內容:
UTC是世界協調時,BJT是北京時間,UTC時間相當於BJT減去8。現在,你的程序要讀入一個整數,表示BJT的時和分。整數的個位和十位表示分,百位和千位表示小時。如果小時小於10,則沒有千位部分;如果小時是0,則沒有百位部分;如果小時不是0而分小於10分,需要保留十位上的0;如果小時是0而分小於10分的,則不需要保留十位上的0。如1124表示11點24分,而905表示9點5分,36表示0點36分,7表示0點7分。
有效的輸入范圍是0到2359,即你的程序不可能從測試服務器讀到0到2359以外的輸入數據。
你的程序要輸出這個時間對應的UTC時間,輸出的格式和輸入的相同,即輸出一個整數,表示UTC的時和分。整數的個位和十位表示分,百位和千位表示小時。如果小時小於10,則沒有千位部分;如果小時是0,則沒有百位部分;如果小時不是0而分小於10分,需要保留十位上的0;如果小時是0而分小於10分的,則不需要保留十位上的0。
提醒:要小心跨日的換算。
輸入格式:
一個整數,表示BJT的時和分。整數的個位和十位表示分,百位和千位表示小時。如果小時小於10,則沒有千位部分;如果小時是0,則沒有百位部分;如果小時不是0而分小於10分,需要保留十位上的0;如果小時是0而分小於10分的,則不需要保留十位上的0。
輸出格式:
一個整數,表示UTC的時和分。整數的個位和十位表示分,百位和千位表示小時。如果小時小於10,則沒有千位部分;如果小時是0,則沒有百位部分;如果小時不是0而分小於10分,需要保留十位上的0;如果小時是0而分小於10分的,則不需要保留十位上的0。
輸入樣例:
803
輸出樣例:
3
// 題目沒有說明是否有1190這樣的輸入,故加入了一個if判別式,來剔除錯誤輸入 // 時間換算 #include<stdio.h> int main(){ int BJT, temp; scanf("%d", &BJT); if (BJT%100>59){ temp = BJT%100; temp -=60; BJT = (BJT/100+1)*100 + temp; } BJT -= 800; if (BJT<0) BJT += 2400; printf("%d", BJT); return 0; }
- 分隊列(5分)(mooc第三周編程練習)
題目內容:
班級第一次列隊,通常老師會讓同學按身高排成一列,然后1、2報數,喊到1的同學向前一 步,就這樣,隊伍就變成兩列了。假設現在一個班級有n個同學,並且他們已經按身高排成 了一列,同學按身高從1到n編號,你能告訴我最后哪些編號的同學站在了第一列么?
輸入格式:
輸入一個正整數n,表示班級的人數。
輸出格式:
按順序輸出所有在第一列的同學對應的編號,每兩個編號之間用一個空格隔開,最后一個編號后面沒有空格。
輸入樣例:
11
輸出樣例:
1 3 5 7 9 11
// 分隊列 // 給出一個整數n,輸出1到n之間的奇數 #include <stdio.h> int main() { int n, i=1; scanf("%d", &n); for (; i<=n; i+=2){ if (i+1 ==n|| i==n) printf("%d", i); else printf("%d ", i); } return 0; }
- 奇偶個數(5分)(mooc第四周編程練習)
題目內容:
你的程序要讀入一系列正整數數據,輸入-1表示輸入結束,-1本身不是輸入的數據。程序輸出讀到的數據中的奇數和偶數的個數。
輸入格式:
一系列正整數,整數的范圍是(0,100000)。如果輸入-1則表示輸入結束。
輸出格式:
兩個整數,第一個整數表示讀入數據中的奇數的個數,第二個整數表示讀入數據中的偶數的個數。兩個整數之間以空格分隔。
輸入樣例:
9 3 4 2 5 7 -1
輸出樣例:
4 2
// 奇偶個數 #include<stdio.h> int main(){ int N, count_double=0, count_single=0; scanf("%d", &N); while(N != -1){ if (N%2 ==0) count_double +=1; else count_single +=1; scanf("%d", &N); } printf("%d %d", count_single, count_double); return 0; }
- 數字特征值(5分)(mooc第四周編程練習)
題目內容:
對數字求特征值是常用的編碼算法,奇偶特征是一種簡單的特征值。對於一個整數,從個位開始對每一位數字編號,個位是1號,十位是2號,以此類推。這個整數在第n位上的數字記作x,如果x和n的奇偶性相同,則記下一個1,否則記下一個0。按照整數的順序把對應位的表示奇偶性的0和1都記錄下來,就形成了一個二進制數字。比如,對於342315,這個二進制數字就是001101。
這里的計算可以用下面的表格來表示:
數字 |
3 |
4 |
2 |
3 |
1 |
5 |
數位 |
6 |
5 |
4 |
3 |
2 |
1 |
數字奇偶 |
奇 |
偶 |
偶 |
奇 |
奇 |
奇 |
數位奇偶 |
偶 |
奇 |
偶 |
奇 |
偶 |
奇 |
奇偶一致 |
0 |
0 |
1 |
1 |
0 |
1 |
二進制位值 |
32 |
16 |
8 |
4 |
2 |
1 |
你的程序要讀入一個非負整數,整數的范圍是[0,1000000],然后按照上述算法計算出表示奇偶性的那個二進制數字,輸出它對應的十進制值。
提示:將整數從右向左分解,數位每次加1,而二進制值每次乘2。
輸入格式:
一個非負整數,整數的范圍是[0,1000000]。
輸出格式:
一個整數,表示計算結果。
輸入樣例:
342315
輸出樣例:
13
// 數字特征值 #include<stdio.h> #include<math.h> int main(){ int N, digit=0, temp; scanf("%d", &N); temp = 1; // 計算出輸入數字位數 while(N/temp!=0) { digit++; temp = pow(10, digit); } int sum = 0; // 比較位數和位值的關系,相同二進制值位1,不同值為0,並將結果轉化成10進制賦予sum for (int i=digit;i>=1;i--){ temp = pow(10, i-1); if (i%2 == (N/temp)%2) sum += pow(2, i-1); N %= temp; } printf("%d", sum); return 0; }
- 素數和(5分)(mooc第五周編程練習)
題目內容:
我們認為2是第一個素數,3是第二個素數,5是第三個素數,依次類推。
現在,給定兩個整數n和m,0<n<=m<=200,你的程序要計算第n個素數到第m個素數之間所有的素數的和,包括第n個素數和第m個素數。
輸入格式:
兩個整數,第一個表示n,第二個表示m。
輸出格式:
一個整數,表示第n個素數到第m個素數之間所有的素數的和,包括第n個素數和第m個素數。
輸入樣例:
2 4
輸出樣例:
15
// 素數和(自己寫的) #include<stdio.h> int main(){ int M, N, sum=0, count =0; scanf("%d %d", &M, &N); for (int i=2;;i++){ for (int j=1;j<=i;j++){ if (i%j==0&&j!=1&&j!=i) break; if (j == i){ count +=1; if(M<=count&& count<=N) sum += i; } } if(count>200) break; } printf("%d", sum); return 0; }
// 傳統判斷素數的方法(翁凱老師) #include<stdio.h> // 在已知的素數表內判斷新數字是否為素數 int isPrime(int x, int knowPrimes[], int numbeOfKnownPrimes){ int ret = 1; int i; for ( i=0; i<numbeOfKnownPrimes; i++ ){ if ( x % knowPrimes[i] == 0){ ret = 0; break; } } return ret; } int main(){ // const int number = 100; // 網頁開發環境中,這條語句不能通過 int prime[200] = {2}; int count = 1; int i = 3; while ( count < 200 ){ if ( isPrime(i, prime, count )) { prime[count++] = i; // 在素數表內判斷后,由返回結果判斷是否將新數字加入到素數表內 } i++; } // 輸出素數表,每五個素數換行一次 // for ( i=0; i<200; i++){ // printf("%d", prime[i]); // if ( (i+1)%5 ) printf("\t"); // else printf("\n"); // } int start, end, sum=0; scanf("%d %d", &start, &end); for (int k=start-1;k<=end-1;k++) sum += prime[k]; printf("%d", sum); return 0; }
- 念整數(5分)(mooc第五周編程練習)
題目內容:
你的程序要讀入一個整數,范圍是[-100000,100000]。然后,用漢語拼音將這個整數的每一位輸出出來。
如輸入1234,則輸出:
yi er san si
注意,每個字的拼音之間有一個空格,但是最后的字后面沒有空格。當遇到負數時,在輸出的開頭加上“fu”,如-2341輸出為:
fu er san si yi
輸入格式:
一個整數,范圍是[-100000,100000]。
輸出格式:
表示這個整數的每一位數字的漢語拼音,每一位數字的拼音之間以空格分隔,末尾沒有空格。
輸入樣例:
-30
輸出樣例:
fu san ling
// 念整數 #include<stdio.h> #include<math.h> int main(){ int N, i, val, temp=1, digit=0; scanf("%d", &N); // 計算該整數的位數 while(N/temp!=0){ digit++; temp = pow(10, digit); } // 負整數需要特殊處理 if (N<0) { printf("fu "); N = -N; } // 整數為零需要特殊處理 if (digit ==0) printf("ling"); // 念整數核心實現部分 for (int j=digit-1;j>=0;j--){ temp = pow(10, j); val = N / temp; switch (val){ case 0:printf("ling"); break; case 1:printf("yi"); break; case 2:printf("er"); break; case 3:printf("san"); break; case 4:printf("si"); break; case 5:printf("wu"); break; case 6:printf("liu"); break; case 7:printf("qi"); break; case 8:printf("ba"); break; case 9:printf("jiu"); break; } N -= temp * val; if (j!=0) printf(" ");return 0; }
- 7-1 重要的話說三遍 (5 分)(PTA)
這道超級簡單的題目沒有任何輸入。
你只需要把這句很重要的話 —— “I'm gonna WIN!”——連續輸出三遍就可以了。
注意每遍占一行,除了每行的回車不能有任何多余字符。
// 重要的話說三遍 #include <stdio.h> int main(int argc, char **argv) { for(int i=0; i<3; i++){ printf("I'm gonna WIN!\n"); } return 0; }
-
7-2 I Love GPLT (5 分)(PTA)
這道超級簡單的題目沒有任何輸入。
你只需要把這句很重要的話 —— I Love GPLT
——豎着輸出就可以了。
所謂“豎着輸出”,是指每個字符占一行(包括空格),即每行只能有1個字符和回車。
// I Love GPLT #include <stdio.h> int main() { char *p = "I Love GPLT"; while(*p){ printf("%c\n", *p++); } return 0; }
-
7-3 輸出帶框文字 (5 分)(PTA)
本題要求編寫程序,輸出指定的帶框文字。
輸入格式:
本題無輸入
輸出格式:
按照下列格式輸出帶框文字。
************
Welcome
************
// 輸出帶框文字 #include<stdio.h> int main(){ char a[]="************"; char b[]="Welcome"; // 標准輸出可以控制第二行的Welcome占用10個位置,且靠右輸出 printf("%s\n%9s\n%s",a, b, a); return 0; }
-
7-4 輸出菱形圖案 (5 分)(PTA)
本題要求編寫程序,輸出指定的由“A”組成的菱形圖案。
輸入格式:
本題無輸入
輸出格式:
按照下列格式輸出由“A”組成的菱形圖案。
// 輸出菱形圖案 #include<stdio.h> void diamond(int n){ for(int i=1; i<=n; i++){ if (i%2==1){ printf(" A\n"); } else { printf("A A\n"); } } } int main(){ diamond(3); return 0; }
-
7-5 輸出倒三角圖案 (5 分)(PTA本題要求編寫程序,輸出指定的由“*”組成的倒三角圖案。
// 掉入陷阱的數字 #include<stdio.h> int number_trap(int N){ int sum=0, result; while(N){ sum += N % 10; N /= 10; } result = sum * 3 + 1; return result; } int main(){ int N, temp, result; scanf("%d", &N); temp = N; for (int i=1;;i++){ result = number_trap(temp); printf("%d:%d\n", i, result); if (temp == result) break; temp = result; } return 0; }
- 7-32 求交錯序列前N項和 (15 分)(PTA)
本題要求編寫程序,計算交錯序列 1-2/3+3/5-4/7+5/9-6/11+... 的前N項之和。
輸入格式:
輸入在一行中給出一個正整數N。
輸出格式:
在一行中輸出部分和的值,結果保留三位小數。
輸入樣例:
5
輸出樣例:
0.917
// 求交錯序列前N項和 #include<stdio.h> #include<math.h> int main() { int N; scanf("%d", &N); float sum = 0; for (float j = 1; j <= N; j++) { sum += (j/(2*j-1))*pow(-1, j+1); } printf("%.3f\n", sum); return 0; }
-
7-33 統計素數並求和 (20 分)(PTA)
本題要求統計給定整數M和N區間內素數的個數並對它們求和。
輸入格式:
輸入在一行中給出兩個正整數M和N(1≤M≤N≤500)。
輸出格式:
在一行中順序輸出M和N區間內素數的個數以及它們的和,數字間以空格分隔。
輸入樣例:
10 31
輸出樣例:
7 143
// 統計素數並求和 #include<stdio.h> const int maxNumber = 501; int main(){ int isPrime[maxNumber]; int i; int x; // 定義一個素數表,初始化假設isPrime表內數字均為素數 for ( i = 0; i<maxNumber; i++ ){ if (i == 1 || i == 0 ) isPrime[i] = 0; else isPrime[i] =1; } // 從較小的數字開始,排除個位素數的倍數,標記為0,遍歷順序由小到大 for ( x=2; x<maxNumber; x++){ if ( isPrime[x] ){ for ( i=2; i*x<maxNumber; i++){ isPrime[i*x] = 0; } } } int m, n, sum=0, count=0; scanf("%d %d", &m, &n); // 輸出標記為非零的數組下標 for ( i=m; i<=n; i++){ if ( isPrime[i] ) { sum += i; count++; } } printf("%d %d\n", count, sum); return 0; }
-
7-34 求分數序列前N項和 (15 分)(PTA)
本題要求編寫程序,計算序列 2/1+3/2+5/3+8/5+... 的前N項之和。注意該序列從第2項起,每一項的分子是前一項分子與分母的和,分母是前一項的分子。
輸入格式:
輸入在一行中給出一個正整數N。
輸出格式:
在一行中輸出部分和的值,精確到小數點后兩位。題目保證計算結果不超過雙精度范圍。
輸入樣例:
20
輸出樣例:
32.66
// 求分數序列前N項和 #include<stdio.h> int main() { int N; double sum = 0, num_up = 2.0, num_down = 1.0; scanf("%d", &N); for (int i = 0; i < N; i++) { sum += num_up/num_down; num_up += num_down; num_down = num_up - num_down; } printf("%.2f\n", sum); return 0; }
-
7-35 猴子吃桃問題 (15 分)(PTA)
一只猴子第一天摘下若干個桃子,當即吃了一半,還不過癮,又多吃了一個;第二天早上又將剩下的桃子吃掉一半,又多吃了一個。以后每天早上都吃了前一天剩下的一半加一個。到第N天早上想再吃時,見只剩下一個桃子了。問:第一天共摘了多少個桃子?
輸入格式:
輸入在一行中給出正整數N(1<N≤10)。
輸出格式:
在一行中輸出第一天共摘了多少個桃子。
輸入樣例:
3
輸出樣例:
10
// 猴子吃桃問題 #include<stdio.h> int main() { int N = 0, num = 1; scanf("%d", &N); for (int i = N-1; i > 0; i--) { num = (num+1)*2; } printf("%d\n", num); return 0; }
-
7-36 韓信點兵 (10 分)(PTA)
在中國數學史上,廣泛流傳着一個"韓信點兵"的故事:韓信是漢高祖劉邦手下的大將,他英勇善戰,智謀超群,為漢朝建立了卓越的功勞。據說韓信的數學水平也非常高超,他在點兵的時候,為了知道有多少兵,同時又能保住軍事機密,便讓士兵排隊報數:
按從1至5報數,記下最末一個士兵報的數為1;
再按從1至6報數,記下最末一個士兵報的數為5;
再按從1至7報數,記下最末一個士兵報的數為4;
最后按從1至11報數,最末一個士兵報的數為10;
請編寫程序計算韓信至少有多少兵。
輸入格式:
本題無輸入
輸出格式:
輸出韓信至少擁有的士兵人數。
// 韓信點兵 #include<stdio.h> int main() { int N; for (int i = 1;;i++) { if(i%5 == 1 && i%6 == 5 && i%7 == 4 && i%11 == 10) { printf("%i\n", i); break; } } return 0; }
-
7-37 輸出整數各位數字 (15 分)(PTA)
本題要求編寫程序,對輸入的一個整數,從高位開始逐位分割並輸出它的各位數字。
輸入格式:
輸入在一行中給出一個長整型范圍內的非負整數。
輸出格式:
從高位開始逐位輸出該整數的各位數字,每個數字后面有一個空格。
輸入樣例:
123456
輸出樣例:
1 2 3 4 5 6
// 輸出整數各位數字 #include<stdio.h> int main() { int N, mask = 1, temp, t; scanf("%d", &N); t = N; while(t > 9) { t /= 10; mask *= 10; } // 這里采用mask作為循環的判定標識,是為了避免出現N=100這種情況,不能完全 // 輸出每一位數字 do { temp = N / mask; printf("%d ", temp); N %= mask; mask /= 10; }while(mask > 0); return 0; }
-
7-38 支票面額 (15 分)(PTA)
一個采購員去銀行兌換一張y元f分的支票,結果出納員錯給了f元y分。采購員用去了n分之后才發覺有錯,於是清點了余額尚有2y元2f分,問該支票面額是多少?
輸入格式:
輸入在一行中給出小於100的正整數n。
輸出格式:
在一行中按格式y.f輸出該支票的原始面額。如果無解,則輸出No Solution。
輸入樣例1:
23
輸出樣例1:
25.51
輸入樣例2:
22
輸出樣例2:
No Solution
// 支票面額 // Bad solution #include<stdio.h> int main(){ int X, Y, N, flag = 1; scanf("%d", &N); for (int i=0;i<=100 && flag;i++){ for (int j=1;j<=100 && flag ;j++){ if((2*i == j && 2*j == i-N )||(2*i+1 == j && 2*j-100== i-N)|| (2*i+2==j && 2*j -100==i+100-N)){ flag = 0; printf("%d.%d\n", i,j); } } } if (flag) printf("No Solution\n"); return 0; }
- 7-39 龜兔賽跑 (20 分)(PTA)
烏龜與兔子進行賽跑,跑場是一個矩型跑道,跑道邊可以隨地進行休息。烏龜每分鍾可以前進3米,兔子每分鍾前進9米;兔子嫌烏龜跑得慢,覺得肯定能跑贏烏龜,於是,每跑10分鍾回頭看一下烏龜,若發現自己超過烏龜,就在路邊休息,每次休息30分鍾,否則繼續跑10分鍾;而烏龜非常努力,一直跑,不休息。假定烏龜與兔子在同一起點同一時刻開始起跑,請問T分鍾后烏龜和兔子誰跑得快?
輸入格式:
輸入在一行中給出比賽時間T(分鍾)。
輸出格式:
在一行中輸出比賽的結果:烏龜贏輸出@_@,兔子贏輸出^_^,平局則輸出-_-;后跟1空格,再輸出勝利者跑完的距離。
輸入樣例:
242
輸出樣例:
@_@ 726
// 龜兔賽跑 // 借鑒網上的思路,原來的方法太復雜了 #include<stdio.h> int main() { int rabbit = 0, tor = 0, T, rab_run = 1, t = 10; scanf("%d", &T); // 龜兔賽跑的核心 while(t <= T){ tor = 3 * t; rabbit += rab_run * 90; if(rabbit > tor){ rab_run = 0; t += 20; }else rab_run = 1; t += 10; } tor = 3 * T; // 例如當比賽時間為44分鍾,兔子還沒有超過烏龜,但由於while循環里最后一行t+=10 // 導致t=50 循環終止,為了補償兔子的4分鍾,特設此條件語句 if (rab_run) rabbit = rabbit + (10-(t-T))*9; if(rabbit > tor) printf("^_^ %d\n", rabbit); else if(tor > rabbit) printf("@_@ %d\n", tor); else printf("-_- %d\n", rabbit); return 0; }
-
7-40 到底是不是太胖了 (10 分)(PTA)
據說一個人的標准體重應該是其身高(單位:厘米)減去100、再乘以0.9所得到的公斤數。真實體重與標准體重誤差在10%以內都是完美身材(即 | 真實體重 − 標准體重 | < 標准體重×10%)。已知市斤是公斤的兩倍。現給定一群人的身高和實際體重,請你告訴他們是否太胖或太瘦了。
輸入格式:
輸入第一行給出一個正整數N(≤ 20)。隨后N行,每行給出兩個整數,分別是一個人的身高H(120 < H < 200;單位:厘米)和真實體重W(50 < W ≤ 300;單位:市斤),其間以空格分隔。
輸出格式:
為每個人輸出一行結論:如果是完美身材,輸出You are wan mei!;如果太胖了,輸出You are tai pang le!;否則輸出You are tai shou le!。
輸入樣例:
3
169 136
150 81
178 155
輸出樣例:
You are wan mei!
You are tai shou le!
You are tai pang le!
// 到底是不是太胖了? #include<stdio.h> #include<math.h> void beauty(int h, int w) { double standard_w, temp_1, temp_2; standard_w = (h-100)*0.9; temp_1 = w/2.0 - standard_w; temp_2 = standard_w*0.1; if(fabs(temp_1) < temp_2) printf("You are wan mei!\n"); else if(w/2.0 > standard_w) printf("You are tai pang le!\n"); else printf("You are tai shou le!\n"); } int main() { int N, H, W; scanf("%d", &N); for (int i = 1; i <= N; i++) { scanf("%d %d", &H, &W); beauty(H, W); } return 0; }