1.OJ 2092(http://acm.hdu.edu.cn/showproblem.php?pid=2092)
Problem Description
有二個(gè)整數(shù),它們加起來(lái)等于某個(gè)整數(shù),乘起來(lái)又等于另一個(gè)整數(shù),它們到底是真還是假,也就是這種整數(shù)到底存不存在,實(shí)在有點(diǎn)吃不準(zhǔn),你能快速回答嗎?看來(lái)只能通過(guò)編程。
例如:
x + y = 9,x * y = 15 ? 找不到這樣的整數(shù)x和y
1+4=5,14=4,所以,加起來(lái)等于5,乘起來(lái)等于4的二個(gè)整數(shù)為1和4
7+(-8)=-1,7(-8)=-56,所以,加起來(lái)等于-1,乘起來(lái)等于-56的二個(gè)整數(shù)為7和-8
Input
輸入數(shù)據(jù)為成對(duì)出現(xiàn)的整數(shù)n,m(-10000<n,m<10000),它們分別表示整數(shù)的和與積,如果兩者都為0,則輸入結(jié)束。
Output
只需要對(duì)于每個(gè)n和m,輸出“Yes”或者“No”,明確有還是沒(méi)有這種整數(shù)就行了。
Sample Input
9 15
5 4
1 -56
0 0
Sample Output
No
Yes
Yes
2.思考:一看到這道題,心想這不是無(wú)腦循環(huán)就可以解決的題嗎,然后一下子就把它跑出來(lái)了
#include<stdio.h>
int main(){
int flag,n,m,i,j;
while(scanf("%d %d",&n,&m)!=EOF){
flag=0;
if(n==0&&m==0)break;
for(i=-9999;i<10000;i++){
for(j=i+1;j<10000;j++){
if(i+j==n&&i*j==m){
flag=1;
break;
}
}
}
if(flag==0)printf("No\n");
else printf("Yes\n");
}
}
但是心中總感覺(jué)有點(diǎn)不對(duì)勁。果然,放上去跑的時(shí)候,顯示超時(shí)了,這個(gè)時(shí)候問(wèn)題就來(lái)了,怎么讓他不超時(shí)呢?
后來(lái)仔細(xì)想想為什么要弄雙重循環(huán)呢,單循環(huán)已經(jīng)足夠解決這個(gè)問(wèn)題了!因?yàn)樗旧硪呀?jīng)有個(gè)默認(rèn)條件i+j=n了。令這個(gè)條件成立再把j=n-i代入i*j==m這個(gè)判斷式中,當(dāng)條件成立時(shí)即為兩個(gè)條件都滿足。
3.實(shí)現(xiàn)代碼:
#include<stdio.h>
int main(){
int flag,n,m,i,j;
while(scanf("%d %d",&n,&m)!=EOF){
flag=0;
if(n==0&&m==0)break;
for(i=-9999;i<10000;i++){
if(i*(n-i)==m){
flag=1;
break;
}
}
if(flag==0)printf("No\n");
else printf("Yes\n");
}
}