c语言输出三个比值为,请问如何用C语言表示数的比值
想表示最大公約數(shù)與最小公倍數(shù)之比為1:120,大概是在判斷語句里,用“最小公倍數(shù)/最大公約數(shù)==120”就行了,如果符合這個(gè)條件就跳出。
代碼:
#include
//求最大公約數(shù)
int GCD(int m,int n)
{
int c,temp=0;
if(m {temp=m;m=n;n=temp;}
for(c=m%n;c!=0;m=n,n=c,c=m%n);
return n;
}
//求最小公倍數(shù)
int LCM(int m,int n)
{
int k=m*n;
int c,temp=0;
if(m {temp=m;m=n;n=temp;}
for(c=m%n;c!=0;m=n,n=c,c=m%n);
return k/n;
}
void main()
{
int a,b,m,n;
for(a=1;a<=333;a )
{
b=667-a;
m=GCD(a,b);
n=LCM(a,b);
if(n==120*m)
{
break;
}
}
printf("a=%d
",a);
printf("b=%d
",b);
}
結(jié)果:
a=115
b=552
(最大公約數(shù)m=23,最小公倍數(shù)n=2760)
===================
你說的三個(gè)條件具體是哪三個(gè)?
其實(shí)主要來說,可以構(gòu)成式子的只有“兩個(gè)數(shù)的合為667”和“最大公約數(shù):最小公倍數(shù)=1:120”這兩個(gè)。
這樣的題目,最直接的思路就是用循環(huán)去一個(gè)一個(gè)試數(shù),然后符合一定條件就結(jié)束循環(huán),此時(shí)循環(huán)到的那個(gè)數(shù)就是你想要的。
但編程序又不能用多元的方程。所以,按其中一個(gè)數(shù)去循環(huán)(按a循環(huán)),則在循環(huán)過程中這個(gè)數(shù)a相當(dāng)于是一個(gè)已知的具體數(shù)值。
另一個(gè)數(shù)b用667-a表示的話,那b的值也可以轉(zhuǎn)化為一個(gè)具體的數(shù)。通過這兩個(gè)數(shù)值能求出他們的最大公約數(shù)m和最小公倍數(shù)n,這就取得了第二個(gè)等式所需要的所有元素的具體值。就可以判斷這個(gè)等式是否成立了。當(dāng)?shù)仁匠闪?#xff0c;跳出循環(huán),此時(shí)的a、b就是你要的解。
其中要注意的:
1、雖然按a、b的和為667來看,a這個(gè)數(shù)的取值范圍是1到666(667和0的組合求最大公約數(shù)和最小公倍數(shù)沒有意義),但是循環(huán)的上線沒必要用666,用它的一半333就行了。
這個(gè)如果不明白的話請(qǐng)留言吧,我再解釋。
2、最大公約數(shù)和最小公倍數(shù)的比值正好是1比一個(gè)整數(shù)值,寫式子的時(shí)候沒有必要按題目敘述的順序?qū)憁/n==1/120,因?yàn)檫@樣出現(xiàn)了實(shí)型數(shù),增加誤差。可以調(diào)整順序?qū)懗傻葍r(jià)的n/m==120,嗯對(duì)了,寫成n==m*120更好!減小誤差。
(我把程序里的條件式也改過來了)
別的有問題再留言吧
(8月21日 17:24)
=====================
不要總想這兩個(gè)條件之間的聯(lián)系,其實(shí)這兩個(gè)條件是各司其職呀!
667的作用有兩點(diǎn)。
一個(gè)是告訴你了這兩個(gè)數(shù)數(shù)值上的直接關(guān)系;另一個(gè)是告訴你了這兩個(gè)數(shù)的取值范圍。在程序上,第一點(diǎn)表現(xiàn)在知道了a的值,就可以用667-a求出b;第二點(diǎn)表現(xiàn)在for循環(huán)的上下限上。
而1:120那個(gè)比值是用來控制程序循環(huán)到什么時(shí)候該出結(jié)果了。
在程序上它表現(xiàn)在if后面括號(hào)里的條件式上。
但怎么很好的應(yīng)用這兩個(gè)條件一定要在理解程序設(shè)計(jì)的結(jié)構(gòu)的前提下。
像我前面說的,“這樣的題目,最直接的思路就是用循環(huán)去一個(gè)一個(gè)試數(shù),然后符合一定條件就結(jié)束循環(huán),此時(shí)循環(huán)到的那個(gè)數(shù)就是你想要的。
”
因?yàn)槭窃嚁?shù)的思路,一定要有循環(huán)的思想!但是在它的取值范圍內(nèi)從頭循環(huán)到尾的過程中,那個(gè)值是你想要的呢?怎么去判斷呢?就要有一個(gè)條件來充當(dāng)這個(gè)裁判。在你的題目中,最大公約數(shù)跟最小公倍數(shù)的比就是這個(gè)裁判。
所以第一次循環(huán)里用a=1、b=666算出的最大公約數(shù)和最小公倍數(shù),一比,不是1:120不要緊,咱們接著循環(huán);第二次a=2、b=665,還是不滿足第二個(gè)條件也不要緊,再循環(huán)……直到a++加到115了,這時(shí)b=667-115=552,用這兩個(gè)數(shù)算出的最大公約數(shù)m和最小公倍數(shù)n的比恰巧為1:120,那么好了,這個(gè)a和b的值就是我們想要的數(shù)。
每一次循環(huán)都肯定滿足第一個(gè)條件,找他們當(dāng)中到底哪一個(gè)能滿足第二個(gè)條件也是要用循環(huán)的目的啊~
就好比上課的時(shí)候老師點(diǎn)名一樣。比如已知你是1年級(jí)2班的一名學(xué)生(相當(dāng)于第一個(gè)條件的第二點(diǎn)),又已知你的名字叫“星空”(相當(dāng)于第二個(gè)條件)。
要求,當(dāng)點(diǎn)到你的名字的時(shí)候你就喊“到”。
這個(gè)過程就是,老師選擇了用1年級(jí)2班的名單(for取值范圍)。從第一個(gè)人開始點(diǎn)名(執(zhí)行for循環(huán)的過程)。第一個(gè)點(diǎn)的是“云淡風(fēng)輕”,你一看,不是你的名,跳過(if語句的條件式為假的情況)。
第二個(gè)點(diǎn)的“蕩漾心情”,你一看,又不是你的名,又跳過。終于在點(diǎn)到第10個(gè)人的時(shí)候點(diǎn)到了“星空”,你一看,終于到自己了(if語句的條件式為真了),你喊了“到”(輸出語句)。
不知道這樣講,這兩個(gè)條件的聯(lián)系是否清楚一些?
還有,你又提到“怎樣來表達(dá)其最大公約數(shù)與最小公倍數(shù)之比”的問題。
知道a和b的值了,可以用函數(shù)求出他們的最大公約數(shù)和最小公倍數(shù)吧。我用m表示最大公約數(shù),n表示最小公倍數(shù)。那么,用數(shù)學(xué)符號(hào)表示,那個(gè)比值的恒等式應(yīng)該是m:n=1:120。作為if語句的條件式(一定要明確這個(gè)等式要用于條件句哦~),c語言的語句是m/n==1/120。
但是為了避免誤差,我們通常要把這個(gè)式子變形為乘法式(原理是純數(shù)學(xué)問題,等式兩邊同乘上n*120),則這個(gè)等式變?yōu)閙*120==n。這種用==連接的判斷語句,==兩頭的表達(dá)式誰在左誰在右都可以。所以寫成if(m*120==n)或者if(n==m*120),放在for循環(huán)里面,當(dāng)?shù)仁匠闪?#xff0c;走if這個(gè)分支的時(shí)候,那就是該喊“到”的時(shí)候了。
另外,你寫的你在編這個(gè)程序的時(shí)候,“另一個(gè)數(shù)為333-a”,我想大概是筆誤吧?667-a才符合條件的。
全部
總結(jié)
以上是生活随笔為你收集整理的c语言输出三个比值为,请问如何用C语言表示数的比值的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 大神进来一下看看丶
- 下一篇: 单片机c语言中的循环语句,单片机c语言教