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