計算完全平方根可以使用math庫中的sqrt完成,但需要注意以下幾點:a取值應為1-9,b取值為0-9;完全平方得到的結果是浮點型,
因為浮點型不像整形可能有誤差的存在(TODO:浮點型計算誤差),可以使用floor(sqrt(x)+0.5)來減小誤差,這里稍微展開說下:如果sqrt(x)的結果本來是1,由於浮點計算的誤差導致結果
為0.9999,那么cast到int型其結果就是0,因此用四舍五入的方式來減少這種誤差(這涉及到浮點型的精度問題,如果精度較高的浮點表示,
那計算結果於預期的波動會相對較小,否則就可能存在較大偏差,當然現代編程語言的精度是可以適用這種方式的)
for (int a = 1; a<=9; a++) { for (int b = 0; b<=9; b++) { int n = 1100 * a + 11 * b; int m = floor(sqrt(a) + 0.5); if (m * m == n) printf("%d ", n); } }
要去考慮誤差略嫌麻煩,可以使用枚舉的方式並根據aabb的特性去考慮它的千位百位以及十位個位是否分別相等
for (int i=31; ; i++) { // 31^2為最大的小於1000的平方整數 int n = i * i; if (n > 9999) break; int a = n / 100; int b = n % 100; if (a/10 == a%10 && b/10 == b%10) printf("%d", n); }
摘錄自<<算法競賽入門經典>>