SDUT-程序设计基础-实验4-for循环(下)
SDUT-程序設(shè)計基礎(chǔ)-實驗4-for循環(huán)(下)
在開始之前,我想要提醒一下大家,在看完答案和解析以后,一定要自己再寫一遍,一味的復(fù)制粘貼沒有任何效果,當(dāng)然,再解析中有任何看不懂的內(nèi)容都可以私信我!!
這期的難度遠(yuǎn)高于上一期,請大家認(rèn)真理解,真的自己打一遍
15.sdut-C語言實驗-完美的素數(shù)
題干如下
素數(shù)又稱質(zhì)數(shù)。指一個大于1的自然數(shù),除了1和此整數(shù)自身外,不能被其他自然數(shù)整除的數(shù)。我們定義:如果一個素數(shù)是完美的素數(shù),當(dāng)且僅當(dāng)它的每一位數(shù)字之和也是一個素數(shù)。現(xiàn)在給你一個正整數(shù),你需要寫個程序判斷一下這個數(shù)按照上面的定義是不是一個完美的素數(shù)。
輸入格式:
輸入包含多組測試數(shù)據(jù)。
每組測試數(shù)據(jù)只包含一個正整數(shù) n (1 < n <= 10^6)。
輸出格式:
對于每組測試數(shù)據(jù),如果 n 是完美的素數(shù),輸出“YES”,否則輸出“NO”(輸出均不含引號)。
輸入樣例:
在這里給出一組輸入。例如:
11
13
輸出樣例:
在這里給出相應(yīng)的輸出。例如:
YES
NO
這個題目,需要我們深刻理解上面第九題的做題思路,需要用到枚舉的方法,這里不多說,根據(jù)題干的意思,這只是一個條件,同時需要分割輸入的數(shù),這個不難,然后加和為原數(shù),才可被稱為完美素數(shù),所以我們只需要將兩個分開判斷,只要同時滿足就輸出yes反而輸出no
#include<stdio.h>int get_prime (int a) {int i = 0;for (i = a - 1; i > 1; i--){if (a % i == 0){return 0;}}if (i == 1)return 1; }int main() {int n, a, sum, m, b;while(scanf("%d",&n) != EOF){a = get_prime(n);sum = 0;while(n>0){m = n % 10;sum += m;n /= 10;}b = get_prime(sum);if(a == 1&&b == 1)printf("YES\n");elseprintf("NO\n");}return 0; }16.sdut-C語言實驗-余弦
題干如下
輸入n的值,計算cos(x)。
輸入格式:
輸入數(shù)據(jù)有多行,每行兩個數(shù),包括x和n。第一數(shù)據(jù)為x,第二個數(shù)據(jù)為n。
輸出格式:
輸出cos(x)的值,保留4位小數(shù)。
輸入樣例:
在這里給出一組輸入。例如:
0.0 100
1.5 3
輸出樣例:
在這里給出相應(yīng)的輸出。例如:
1.0000
0.0701
這個題目給出兩個不同的方法
1.遞推的方法,即后一項=前一項XX / ((2i)(2*i-1)),這個是這個題目相對簡單的一種方式,也較為難理解,但可以減少代碼長度,更加精簡,不做贅述
#include <stdio.h>int main() {double x;int n;while(scanf("%lf %d", &x, &n) != EOF){double k = 1.0, flag = 1.0, ans = 0.0;for(int i = 0; i <= n; i ++){if(i != 0){k = k*(x*x)*1.0/((2*i)*(2*i-1));}ans += (k*flag);flag = -flag;}printf("%.4lf\n", ans);}return 0; }2.這個方法就是通項,這個相對好理解,但寫起來不算簡單,根據(jù)題干的意思列出通項,然后加和即可完成,在此過程中需要用到循環(huán)的嵌套,同時需要用到pow這個函數(shù),用法
例 pow(a,b)即求a的b次方,當(dāng)然也要引用math這個頭函數(shù),只要思路清晰,循環(huán)套循環(huán)并沒有想象中那么難。
17.sdut-C語言實驗-求某個范圍內(nèi)的所有素數(shù)
題干如下
求小于n的所有素數(shù),按照每行10個顯示出來。
輸入格式:
輸入整數(shù)n(n<10000)。
輸出格式:
每行10個依次輸出n以內(nèi)(不包括n)的所有素數(shù)。如果一行有10個素數(shù),每個素數(shù)后面都有一個空格,包括每行最后一個素數(shù)。
輸入樣例:
100
輸出樣例:
2 3 5 7 11 13 17 19 23 29
31 37 41 43 47 53 59 61 67 71
73 79 83 89 97
對于這個題目,也需要之前題目的鋪墊,只要判斷素數(shù)的枚舉能理解,這個題目只需要多一個判斷條件,即使用一個變量不斷累加,在取余10得整數(shù),即10的倍數(shù)的時候,換行即可實現(xiàn)題目要求
#include <stdio.h>int main() {int n,a=0,i,t;scanf("%d",&n);for(i=2;i<n;i++){if(i==2){printf("%d ",i);a++;}else{for(t=2;t<i;t++){if(i%t==0)break;}if(i==t){printf("%d ",i);a++;if(a%10==0)printf("\n");}}}return 0; }18.水仙花數(shù)
題干如下
水仙花數(shù)是指一個N位正整數(shù)(N≥3),它的每個位上的數(shù)字的N次冪之和等于它本身,本題要求編寫程序,計算所有N位水仙花數(shù)。
輸入格式:
輸入在一行中給出一個正整數(shù)N(3≤N≤7)。
輸出格式:
按遞增順序輸出所有N位水仙花數(shù),每個數(shù)字占一行。
輸入樣例:
3
輸出樣例:
153
370
371
407
這個題目難度相對較高,首先我們需要明白,怎么實現(xiàn)范圍的固定,即確定為N位數(shù),這里需要用到pow這個函數(shù),用法見上題,只需要控制范圍在pow(10,N-1)<=
x < pow(10,
N),這個很好理解,10的一次方是2位數(shù),且最后一個是100-1,這樣就可以做到范圍的控制,然后后面就是常規(guī)的,維護(hù)循環(huán)中的幾個變量,實現(xiàn)不斷加和,最后進(jìn)行判斷然后打印即可
19.計算階乘和
題干如下
對于給定的正整數(shù)N,需要你計算 S=1!+2!+3!+…+N!。
輸入格式:
輸入在一行中給出一個不超過10的正整數(shù)N。
輸出格式:
在一行中輸出S的值。
輸入樣例:
3
輸出樣例:
9
這個題目給出兩種不同的方法
1.常規(guī)方法,我們只需要根據(jù)題干的意思,維護(hù)變量,然后加和,同時這里的階乘給出一種遞推的方法,即前一個數(shù)的階乘再乘下個數(shù)就是下個數(shù)的階乘,實現(xiàn)了對循環(huán)結(jié)構(gòu)的優(yōu)化,當(dāng)然也可以再嵌套一個循環(huán),求出每個數(shù)的階乘和。
2.函數(shù)的做法,即如果沒想到遞推的方法時,可以實現(xiàn)對循環(huán)結(jié)構(gòu)的優(yōu)化,可以防止循環(huán)的嵌套,減少難度
#include<stdio.h>int get_factorial (int m) {int i = 1, sum = 1;for(i;i<=m;i++){sum *= i;}return sum; }int main() {int a,sum=0,t;scanf("%d",&a);for(int i = 1 ; i <= a ; i++){t = get_factorial(i);sum += t;}printf("%d",sum);return 0; }20.輸出整數(shù)各位數(shù)字
本題要求編寫程序,對輸入的一個整數(shù),從高位開始逐位分割并輸出它的各位數(shù)字。
輸入格式:
輸入在一行中給出一個長整型范圍內(nèi)的非負(fù)整數(shù)。
輸出格式:
從高位開始逐位輸出該整數(shù)的各位數(shù)字,每個數(shù)字后面有一個空格。
輸入樣例:
123456
輸出樣例:
1 2 3 4 5 6
這個題目給出兩種不同的方法
1.第一種方法是函數(shù)遞歸,遞歸可以理解成為函數(shù)的嵌套,即在函數(shù)中再次引用這個函數(shù),屬于較難理解的方法,可以暫時初步接觸一下,理解即可,不要求寫出來
#include<stdio.h>void get_print (long long m) {if(m > 9)get_print(m / 10);printf("%d ", m % 10); }int main() {long long a;scanf("%lld", &a);get_print(a);return 0; }2.第二種即為循環(huán)中拆分?jǐn)?shù)字的做法,是一種常見的方法,這里不做贅述
#include<stdio.h> int main(){int n, t;int m=1;scanf("%d", &n);t = n;while(t/10 != 0){m *= 10;t /= 10; }while(m!=0){printf("%d ", n/m); n %= m; m /= 10; }return 0; }21.打印九九口訣表
題干如下
下面是一個完整的下三角九九口訣表:
11=1
12=2 22=4
13=3 23=6 33=9
14=4 24=8 34=12 44=16
15=5 25=10 35=15 45=20 55=25
16=6 26=12 36=18 46=24 56=30 66=36
17=7 27=14 37=21 47=28 57=35 67=42 77=49
18=8 28=16 38=24 48=32 58=40 68=48 78=56 88=64
19=9 29=18 39=27 49=36 59=45 69=54 79=63 89=72 99=81
本題要求對任意給定的一位正整數(shù)N,輸出從11到N*N的部分口訣表。
輸入格式:
輸入在一行中給出一個正整數(shù)N(1≤N≤9)。
輸出格式:
輸出下三角N*N部分口訣表,其中等號右邊數(shù)字占4位、左對齊。
輸入樣例:
4
輸出樣例:
11=1
12=2 22=4
13=3 23=6 33=9
14=4 24=8 34=12 44=16
對于這個題目,相較于之前的題目,沒有什么難點,唯一的難點在于如何占四位,左對齊,一般來說,我們會使用 %nd
的方式來保留占n位,但此時,默認(rèn)是右對齊,因此,只需要在n前面加上一個負(fù)號就可以實現(xiàn)左對齊,然后是要注意給換行設(shè)定一個判斷條件,來實現(xiàn)打印九九乘法表
22.找完數(shù)
題干如下
所謂完數(shù)就是該數(shù)恰好等于除自身外的因子之和。例如:6=1+2+3,其中1、2、3為6的因子。本題要求編寫程序,找出任意兩正整數(shù)m和n之間的所有完數(shù)。
輸入格式:
輸入在一行中給出2個正整數(shù)m和n(1< m ≤ n ≤ 10000),中間以空格分隔。
輸出格式:
逐行輸出給定范圍內(nèi)每個完數(shù)的因子累加形式的分解式,每個完數(shù)占一行,格式為“完數(shù) = 因子1 + 因子2 + … + 因子k”,其中完數(shù)和因子均按遞增順序給出。若區(qū)間內(nèi)沒有完數(shù),則輸出“None”。
輸入樣例:
2 30
輸出樣例:
6 = 1 + 2 + 3
28 = 1 + 2 + 4 + 7 + 14
對于這個題目,在做之前需要大家理清思路,思路不清晰容易越做越亂,首先,我們需要確定,什么是完數(shù),根據(jù)題干的意思就是把所有因數(shù)相加,顯然,這里需要一個循環(huán),其次,要根據(jù)第一行給出的數(shù)字判斷范圍,要使用枚舉法,這里也是一個循環(huán),并且這個循環(huán)是需要套在上個循環(huán)之外的,再其次,這里需要一個判斷條件查看是否存在完數(shù),最后就是如何打印,在打印的時候,肯定是先尋找因數(shù),因此這也是一個循環(huán),寫到這里,這個題目就迎刃而解了。
#include<stdio.h>int get_perfect(int a)//此函數(shù)可以放在主函數(shù)內(nèi) {int sum = 0, i;for (i = 1; i < a; i++){if (a % i == 0){sum += i;}}if (sum == a)return 1;return 0; }int main() {int a, b, c, count = 0;scanf("%d %d", &a, &b);for (int i = a; i <= b; i++)//一重循環(huán){c = get_perfect(i);if (c == 1){count++;//判斷條件printf("%d = 1", i);for (int j = 2; j < i; j++)//內(nèi)循環(huán){if (i % j == 0){printf(" + %d", j);}if (j == i - 1)printf("\n");}}}if (count == 0)printf("None");return 0; }23.編程打印空心字符菱形
題干如下
本題目要求讀入菱形起始字母和菱形的高度,然后輸出空心字符菱形。所謂“空心菱形”是指:每行由兩端為字母、中間為空格的字符串構(gòu)成,每行的字符串中心對齊;上半部分相鄰兩行字符串長度差2,且字母從給定的起始字母逐一遞增;下半部分與上半部分對稱。
輸入格式:
輸入在一行中給出起始字母(范圍為英文大寫字母A-G)和菱形的高度(為不超過10的奇數(shù))。
輸出格式:
輸出空心字符菱形。
輸入樣例:
B 5
輸出樣例:
B
C C
D D
C C
B
這個題目是整個實驗四當(dāng)中最難的一部分,后續(xù)我會專門出一個關(guān)于如何打印各種菱形的博客(指挖坑不知道什么時候填),大家記得及時觀察動態(tài)。這個題目的詳細(xì)解析放到代碼中了。
#include <stdio.h> // 1、先畫出實心菱形(把菱形分成上下倆部分,再分成正三角和倒三角 ) // 2、 把輸入的N(n層)帶入循環(huán) // 3、 用if語句使菱形中心為空 // 4、 利用ASCII碼的加減 實現(xiàn)字母組成 int main() {int n,i,j;char c;scanf("%c%d",&c,&n);//針對奇數(shù)層的菱形 上部分for(i=1;i<=n/2+1;i++){//第一個為上班邊的倒三角 for(j=n/2;j>=i;j--)printf(" ");//第二個上半邊的正三角 for(j=0;j<i*2-1;j++){//菱形中間的空心用if else來實現(xiàn) if(j==0 || j==i*2-2) printf("%c",c);else printf(" ");}c+=1;printf("\n");}c-=1; //下部分for(i=1;i<=n/2;i++){c-=1;//第三個為下半邊的正三角 for(j=1;j<=i;j++)printf(" ");//第四個三角形為倒三角形for(j=n-2;j>=i*2-1;j--){if(j==n-2 || j==i*2-1) printf("%c",c);else printf(" ");} printf("\n");} }24.求數(shù)列前n項之和
題干如下
已知數(shù)列1,1/3,1/5,1/7,…,求出其前n項之和,其中的實型變量用double類型。
輸入格式:
輸入n的值,n的值為1到100之間的整數(shù)。
輸出格式:
以保留兩位小數(shù)的形式輸出數(shù)列前n項的和并換行。
輸入樣例:
3
輸出樣例:
1.53
這個題目較為簡單,相信不會難倒大家,只需要維護(hù)分母和加和兩個變量即可,并不難。
#include<stdio.h>int main() {int n, m;double a,sum=0.0;scanf("%d", &n);for(int i = 0; i < n; i++){m = 2 * i + 1;a = 1.0/m;sum += a;}printf("%.2lf\n",sum);return 0; }以上即為實驗設(shè)計基礎(chǔ)-實驗4的所有題目題干詳細(xì)解析和答案,希望同學(xué)們能多多思考,一味的復(fù)制粘貼沒有任何效果,大家學(xué)業(yè)順利!!當(dāng)然,在詳解中沒有看懂的內(nèi)容可以私信我!!
總結(jié)
以上是生活随笔為你收集整理的SDUT-程序设计基础-实验4-for循环(下)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 可由低通滤波器推导变换为高通、带通、带阻
- 下一篇: getline用法