Это не работает :

for(int i=a;i<=b;i++)  
{      
    if(sqrt(i)==int) count++;  
} 

Что я должен использовать?

c
-8
Milindkumar Shinalkar 2 Сен 2017 в 20:42

4 ответа

Лучший ответ

Сделайте что-то вроде ниже:

double a = 5, b = 25;
short count = 0;
for (double i = a; i <= b; i++) {
    double sqrut=sqrt(i); 
    if ((int)(sqrut) == sqrut) {
        printf("Perfect square %.0f found\n", i);
        count++;
    }
}
printf("Total number of perfect squares is %d\n", count);

Или как ниже:

double a = 5, b = 25;
short count = 0;
for (double i = a; i <= b; i++) {
    int sqrut = sqrt(i); // An implicit casting happens here.
    if ((sqrut * sqrut) == i) {
        printf("Perfect square %.0f found\n", i);
        count++;
    }
}
printf("Total number of perfect squares is %d\n", count);
0
sjsam 2 Сен 2017 в 18:11
double iii = 4.0000000000000006;

double eee = sqrt(iii);

int fff = eee;

printf("%d\n", (int)eee == eee);    // returns 1 - which is incorrect

printf("%d\n", fff * fff == eee);   // returns 0  -- correct answer
-1
P__J__ 2 Сен 2017 в 17:59

Чтобы увидеть, есть ли в double дробь, используйте modf()

Функции modf разбивают значение аргумента на целые и дробные части, C11dr §7.12.6.12 2

double root = sqrt(x);
double int_part;
if (modf(root, &int_part) == 0.0) puts("root is a whole number");

Обратите внимание, что sqrt(x) предоставляет только самое близкое представимое double к математическому квадратному корню из x и поэтому может давать приблизительно правильные результаты как root.

0
chux - Reinstate Monica 2 Сен 2017 в 20:26

Один из способов сделать это - обрезать корень до int и проверить, влияет ли это на значение:

double root = sqrt(i);
if ((int) root == root) {
    count++;
}
0
Mureinik 2 Сен 2017 в 17:50