1.OJ 2092(http://acm.hdu.edu.cn/showproblem.php?pid=2092)
Problem Description
有二個整數遗座,它們加起來等于某個整數,乘起來又等于另一個整數俊扳,它們到底是真還是假途蒋,也就是這種整數到底存不存在,實在有點吃不準馋记,你能快速回答嗎号坡?看來只能通過編程。
例如:
x + y = 9梯醒,x * y = 15 ? 找不到這樣的整數x和y
1+4=5宽堆,14=4,所以茸习,加起來等于5日麸,乘起來等于4的二個整數為1和4
7+(-8)=-1,7(-8)=-56逮光,所以代箭,加起來等于-1,乘起來等于-56的二個整數為7和-8
Input
輸入數據為成對出現的整數n涕刚,m(-10000<n,m<10000)嗡综,它們分別表示整數的和與積,如果兩者都為0杜漠,則輸入結束极景。
Output
只需要對于每個n和m,輸出“Yes”或者“No”驾茴,明確有還是沒有這種整數就行了盼樟。
Sample Input
9 15
5 4
1 -56
0 0
Sample Output
No
Yes
Yes
2.思考:一看到這道題,心想這不是無腦循環(huá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++){
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");
}
}
但是心中總感覺有點不對勁晨缴。果然,放上去跑的時候峡捡,顯示超時了击碗,這個時候問題就來了,怎么讓他不超時呢们拙?
后來仔細想想為什么要弄雙重循環(huán)呢稍途,單循環(huán)已經足夠解決這個問題了!因為他本身已經有個默認條件i+j=n了砚婆。令這個條件成立再把j=n-i代入i*j==m這個判斷式中械拍,當條件成立時即為兩個條件都滿足。
3.實現代碼:
#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");
}
}