想問一下,if語句中為什么寫上*1.0之后,輸出的就是對的個數29,但把*1.0刪掉后,輸出的個數就遠大于29了?
還想討教一下各位高手,除了這種暴力求法,還有其他的比較好的方法嗎?非常感謝
/*
湊算式
B??????DEF
A?+?--?+?--?=?10
C??????GHI
(假如顯示有問題,可以參見【圖1.jpg】)
這個算式中A~I代表1~9的數字,不同的字母代表不同的數字。
例如:
6+8/3+952/714?就是一種解法,
5+3/1+972/486?是另一種解法。
這個算式一共有多少種解法?*/
#include?
int?main(){
int?b,c,d,e,f,g,h,i,j;
int?k?=?0;
for(b=1;?b<=9;?b++){
for(c=1;?c<=9;?c++){
if(b==c){
continue;
}
for(d=1;?d<=9;?d++){
if(d==c?||?d==b){
continue;
}
for(e=1;?e<=9;?e++){
if(e==b?||?e==c?||?e==d){
continue;
}
for(f=1;?f<=9;?f++){
if(f==b?||?f==c?||?f==d?||?f==e){
continue;
}
for(g=1;?g<=9;?g++){
if(g==b?||?g==c?||?g==d?||?g==e?||?g==f){
continue;
}
for(h=1;?h<=9;?h++){
if(h==b?||?h==c?||?h==d?||?h==e?||?h==f?||?h==g){
continue;
}
for(i=1;?i<=9;?i++){
if(i==b?||?i==c?||?i==d?||?i==e?||?i==f?||?i==g?||?i==h){
continue;
}
for(j=1;?j<=9;?j++){
if(j==b?||?j==c?||?j==d?||?j==e?||?j==f?||?j==g?||?j==h?||?j==i){
continue;
}
if(fabs(b*1.0?+?c*1.0?/?d?+?(e?*?100?+?f?*?10?+?g)*1.0?/?(h?*?100?+?i?*?10?+?j)?-?10.00)?
k++;
printf("%d?%d?%d?%d?%d?%d?%d?%d?%d\n",b,c,d,e,f,g,h,i,j);
}
}
}
}
}
}
}
}
}
}
printf("%d",k);
return?0;
}
解決方案
40
乘以1.0的作用是將其轉換為double形,你刪掉1.0對每個數使用強制類型轉換也可以。5*1.0你可以寫成(double)5。原因,1/2按整形計算結果為0,4/3按整形結果為1,所以這樣和你算得會不一致,1*1.0/2原因是1.0的存在,該算式中的其他數字被強制類型轉換為double,最后結果為0.5。
CodeBye 版權所有丨如未注明 , 均為原創丨本網站采用BY-NC-SA協議進行授權 , 轉載請注明C語言 湊算式 控制精度問題!