invalid operands of types ‘double’ and ‘int’ to binary ‘operator%’

0

Witam. Mam do napisania program, który wykona różne myki, ale z tym nie mam problemu... Mam mianowicie z błędem:
[code]invalid operands of types ‘double’ and ‘int’ to binary ‘operator%’[/code]

#include<iostream>
#include<math.h>
using namespace std;

int main() {
	int a,b,c,n;
	int sum=0;
	cin >> a;
        for(b=0;b<a;b++) {
		cin >> n;
		while(n != 1) {
			if(sqrt(n)%1==0) {
				if(sqrt(n)<=1) {
					n=sqrt(n);
				}
			}
			else {
				n=n-1;
			}
			sum++;
		}
		cout << sum << endl;
	}
	return 0;
}

Proszę bardzo o wskazanie błędu jak najszybciej.

0

a co to: sqrt(n)%1==0 niby ma robić? sprawdzasz czy 1.424234234 jest podzielne przez 1?

0

Sprawdzam, czy ta liczba jest bez przecinka... Chyba tak się sprawdza.

0

Chyba nie ;]
Operator modulo (%) zwraca resztę z dzielenia liczby całkowitej przez liczbę całkowitą.

0

Ja uważam, że tak jest, ale jak każdy człowiek, mogę się mylić... A twój komentarz w żaden sposób mi nie pomógł :P

0

Może tak?

 if(sqrt(n)%1.0==0)
0

Błąd się zmienił na:
[code]
error: invalid operands of types ‘double’ and ‘double’ to binary ‘operator%’
[/code]

1

@Sarrus, przecież to to samo :|
@MJay - istnieje też pojęcie modulo liczb zmiennoprzecinkowych.
http://en.cppreference.com/w/cpp/numeric/math/fmod
http://en.cppreference.com/w/cpp/numeric/math/remainder

Jest jeszcze jeden problem w takim kodzie, mianowicie liczby zmiennoprzecinkowe nie są idealnie dokładne i nie należy ich porównywać przez == lub !=. Proponowałbym raczej:

#define EPSILON 0.000001
#define IS_ZERO(x) ((x) < EPSILON && (x) > -EPSILON)

I sprawdzanie czy float jest zerem przez IS_ZERO

0

@Tezcatlipoca, Oczywiście, że jest, nie powiedziałem, że nie.
Napisałem, że operator modulo pracuje tylko na liczbach całkowitych.

Do sprawdzania reszty z dzielenia liczb zmiennoprzecinkowych używa się funkcji fmod(double, double).

2

można prosto to zrobić np. tak:
int n; <-- to jest ta Twoja liczba
int x = int(sqrt(n)+0.5);
i warunek powinien wygladac tak: x*x==n

0

Hmm... A wie ktoś może, czemu nie działa program ?
Powinien dla liczby 10, napisać najmniejszą liczbę ruchów.

0

program działa, tylko nie tak jak oczekujesz. ponieważ nie napisałeś co ten program ma właściwie robić to jak mamy Ci pomóc?

0

Można też:

double x = sqrt(n);
if(floor(x) == ceil(x)) /* coś tam */;
0
  1. zgadzam się krwq napisz co ten program am robić to łatwiej będzie cie naprowadzić na właściwe rozwiązanie (z kodu wynika, że liczysz coś dziwnego, więc przypuszczam, ze więcej masz źle)
  2. z kodu wynika, że powinieneś to sprawdzanie zrobić tak:
int x = sqrt(n); // tu jest konwersja do int
if (x*x==n) { // tu sprawdzamy czy n jest kwadratem jakiejś liczby
// tu miałeś bez sensu:  if(sqrt(n)<=1) { to jest prawda tylko dla n=0 i n=1
//                                        n=sqrt(n);
//                                }
    if (n>1) n--;
}
0

można też

if (x == roundf(x))

1 użytkowników online, w tym zalogowanych: 0, gości: 1