一、最大公約數(shù)與最小公倍數(shù)(GCD,LCM)
輸入兩個(gè)正整數(shù)m,n,求它們的最大公約數(shù)與最小公倍數(shù)
法一:枚舉法
源代碼:
#include <stdio.h>void fun(int m,int n){ int i; int gcd,lcm; //最大公約數(shù)與最小公倍數(shù) for(i=(m>n?n:m);i>=1;i--) { if(m%i==0 && n%i==0) { gcd=i; break; } } lcm=m*n/gcd; PRintf("%d %d/n",gcd,lcm);}int main(){ int m,n; while(scanf("%d %d",&m,&n)!=EOF) fun(m,n); } 法二:輾轉(zhuǎn)相除法 思想:(1)用較大的數(shù)m除以較小的數(shù)n,得到的余數(shù)存儲(chǔ)到變量p中,即p=m%n;
(2)上一步中較小的除數(shù)n和得出的余數(shù)b構(gòu)成新的一對(duì)數(shù),并分別賦值給m和n,繼續(xù)做上面的除法;
(3)若余數(shù)為0,其中較小的數(shù)(即除數(shù))就是最大公約數(shù),否則重復(fù)(1)(2)兩步。
源代碼:
#include <stdio.h>void fun(int m,int n){ int p,q,t; int gcd,lcm; q=m*n; if(m<n) { t=m; m=n; n=t; } while(n!=0) //接下來(lái)的循環(huán)中m為最大公約數(shù),n為余數(shù) { p=m%n; m=n; n=p; } gcd=m; lcm=q/gcd; printf("%d %d/n",gcd,lcm);}int main(){ int m,n; while(scanf("%d %d",&m,&n)!=EOF) fun(m,n);} 程序截圖:
二、歌星大獎(jiǎng)賽
某歌星大獎(jiǎng)賽中,有10個(gè)評(píng)委為參賽選手打分,分?jǐn)?shù)為1~100分。選手最后得分為:去掉一個(gè)最高分和一個(gè)最低分后其余8個(gè)分?jǐn)?shù)的平均值。編寫(xiě)程序?qū)崿F(xiàn)。
源代碼:
#include <stdio.h>#include <string.h>#define maxn 11int main(){ int i,a[maxn]={0}; int sum,maxscore,minscore; double average; while(scanf("%d",&a[0])!=EOF) { for(i=1;i<10;i++) scanf("%d",&a[i]); maxscore=minscore=a[0]; sum=0; for(i=0;i<10;i++) { sum+=a[i]; if(a[i]>maxscore) maxscore=a[i]; if(a[i]<minscore) minscore=a[i]; } sum-=(maxscore+minscore); average=sum*1.0/8; printf("max=%d min=%d/n",maxscore,minscore); printf("score=%.2lf/n",average); memset(a,0,sizeof(a)); //初始化數(shù)組 } return 0;} 程序截圖:
三、將真分?jǐn)?shù)分解為埃及分?jǐn)?shù)
輸入一個(gè)真分?jǐn)?shù),將該分?jǐn)?shù)分解為n個(gè)(n>=1)埃及分?jǐn)?shù)和的形式。
分子是1的分?jǐn)?shù),叫單位分?jǐn)?shù)。古代埃及人在進(jìn)行分?jǐn)?shù)運(yùn)算時(shí),只使用分子為1的分?jǐn)?shù)。因此這種分?jǐn)?shù)也叫做埃及分?jǐn)?shù)。
例如:8/11=1/2+1/5+1/55+1/110。
【分析】真分?jǐn)?shù)分解為埃及分?jǐn)?shù)之和的思路:
(1)分?jǐn)?shù)的分子與分母分別用a和b表示,變量c用來(lái)存儲(chǔ)各個(gè)埃及分?jǐn)?shù)的分母;
(2)如果分母能夠整除分子,可直接約減成一個(gè)埃及分?jǐn)?shù),此時(shí)埃及分?jǐn)?shù)的分母c=b/a,分子為1,即直接將變量a賦值為1;
(3)否則分?jǐn)?shù)中一定包含一個(gè)分母為(b/a)+1的埃及分?jǐn)?shù)(即可分解出一個(gè)分母為(b/a)+1的埃及分?jǐn)?shù),c=(b/a)+1);
(4)如果分子是1,表明已經(jīng)是埃及分?jǐn)?shù),不用再分解,結(jié)束;
(5)如果分子是3且分母是偶數(shù),則可直接分解成兩個(gè)埃及分?jǐn)?shù)1/(b/2)和1/b,結(jié)束;
(6)從分?jǐn)?shù)中減去這個(gè)分母為(b/a)+1的埃及分?jǐn)?shù),回到步驟(2)重復(fù)上述過(guò)程。
源代碼:
#include <stdio.h>int main(){ long int a,b,c; //a-分?jǐn)?shù)分子 b-分?jǐn)?shù)分母 c-各個(gè)埃及分?jǐn)?shù)的分母 while(scanf("%ld/%ld",&a,&b)!=EOF) { while(1) { if(b%a!=0) //若分子不能整除分母,則分解出一個(gè)分母為b/a+1的埃及分?jǐn)?shù) c=b/a+1; else //否則,輸出化簡(jiǎn)后的真分?jǐn)?shù)(埃及分?jǐn)?shù)) { c=b/a; a=1; } if(a==1) //a為1標(biāo)志階數(shù) { printf("1/%ld/n",c); break; } else printf("1/%ld+",c); a=a*c-b; //求出余數(shù)的分子 b=b*c; //求出余數(shù)的分母 if(a==3 && b%2==0) //若余數(shù)分子為3,分母為偶數(shù),輸出最后兩個(gè)埃及分?jǐn)?shù) { printf("1/%ld+1/%ld/n",b/2,b); break; } } } return 0;}程序截圖:
四、列出真分?jǐn)?shù)序列
按遞增順序依次列出所有分母為n,分子小于n的最簡(jiǎn)真分?jǐn)?shù)
源代碼:
法一:枚舉分?jǐn)?shù)的分子
#include <stdio.h>int main(){ int fz,fm,n; int i,flag; while(scanf("%d",&n)!=EOF) { fm=n; for(fz=1;fz<fm;fz++) { flag=1; for(i=2;i<=fm/2;i++) { if(fm%i==0 && fz%i==0) { flag=0; break; } } if(flag==1) printf("%d/%d/n",fz,fm); } } return 0;}法二:結(jié)合輾轉(zhuǎn)相除法思想求解(可降低算法復(fù)雜度)
#include <stdio.h>int main(){ int i,j,n; int num1,num2; while(scanf("%d",&n)!=EOF) { for(i=1;i<=n;i++) { num1=n; num2=i; while(num2!=0) //輾轉(zhuǎn)相除法求最大公約數(shù) { j=num1%num2; num1=num2; num2=j; } if(num1==1) //分子與分母的最大公約數(shù)為1時(shí),該分?jǐn)?shù)為最簡(jiǎn)真分?jǐn)?shù) printf("%d/%d/n",i,n); } } return 0;}程序截圖:
五、多項(xiàng)式之和的計(jì)算
計(jì)算下列多項(xiàng)式的值:S=1+1/(1*2)+1/(1*2*3)+ … + 1/(1*2*3* … *50)
源代碼:
#include <stdio.h>int main(){ int i,j,n; double t,sum; while(scanf("%d",&n)!=EOF) { sum=0; for(i=1;i<=n;i++) { t=1; for(j=1;j<=i;j++) //注意精度問(wèn)題,可以將階乘形式的分母進(jìn)行轉(zhuǎn)化,計(jì)算 t*=(1.0/j); sum+=t; } printf("%lf/n",sum); } return 0;}程序截圖:
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注