对于整数输入,只有平方数的平方根是有理数.因此,您的问题可归结为查找您的号码是否为正方形.比较问题:确定输入是否是完美正方形的好算法是什么?.
如果您将有理数作为输入(即,以两个整数之间的比率给出的数字),请检查除数和被除数是否为完美正方形.
对于浮点值,可能没有解决方案,因为您无法使用截断的十进制表示来检查数字是否合理.
在阅读评论和我提出的另一个问题的答案后,我意识到问题来自浮点不准确,这意味着某些值(例如 0.01)将在程序结束时无法通过逻辑测试。我已将其修改为使用NSDecimalNumber变量。
double num, originalnum, multiplier;
int a;
NSLog(@"Enter a number");
scanf("%lf", &num);
//keep a copy of the original number
originalnum = num;
//increases the number until it is an integer, and stores the amount of times it does it in a
for (a=1; fmod(num, 1) != 0 ; a++) {
num *= 10;
}
a--;
//when square-rooted the decimal points have to be added back in
multiplier = pow(10, (a/2));
if (fmod(originalnum, 1) != 0) {
multiplier = 10;
}
NSDecimalNumber *temp = [NSDecimalNumber decimalNumberWithDecimal:[[NSNumber numberWithDouble:sqrt(num)/multiplier] decimalValue]];
NSDecimalNumber *result = [temp decimalNumberByMultiplyingBy:temp];
NSDecimalNumber *originum = [NSDecimalNumber decimalNumberWithDecimal:[[NSNumber numberWithDouble:originalnum] decimalValue]];
if ((fmod(sqrt(num), 1) == 0) && ([result isEqualToNumber:originum])) {
NSLog(@"The square root of %g is %@", originalnum, temp);
}
else {
NSLog(@"The square root of this number is irrational");
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2765 次 |
| 最近记录: |