maradékos osztás C-ben [megoldva]

 ( bzs | 2014. július 25., péntek - 10:42 )

Sziasztok.

Egy pozitív egész szám modulo n értékét szeretném venni C nyelven.
Finomabban fogalmazva k pozitív egészet n-nel (100-zal) szeretném osztani és d maradék érdekelne.

Bash-ban megírva a kód egyszerű, de most fejlődni szeretnék és C-ben szeretném megvalósítani mindezt.

--------------------------
# bash:
# echo 4728 mod 100 | genius

/* C kód: */
printf("%.0lf dec %.0lf deg %06.3lf'\n",t/100,(d),m);
--------------------------

Tehát van a fenti sorom, ahol (d) az a változó, melyből modulo maradékot akarok képezni 100.
Gyakorlatilag csak a tizeseket meg egyeseket szeretném belőle meghagyni, gondoltam ez a legszebb megoldás.

C-ben szerintetek hogyan lehet ezt megtenni?
Bonyolultabb, mint bashban?

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

4728 % 100

----------------------
"ONE OF THESE DAYS I'M GOING TO CUT YOU INTO LITTLE PIECES!!!$E$%#$#%^*^"
--> YouTube csatornám

Kipróbáltam, sajnos ez jött ki:

# gcc sajat.c -o sajat -lm
sajat.c: In function ‘main’:
sajat.c:48:60: error: invalid operands to binary % (have ‘double’ and ‘int’)
printf("minutes: %.0lf dec %.0lf deg %06.3lf'\n",t/100,(d % 100),m);
# gcc sajat.c -o sajat -lm
sajat.c: In function ‘main’:
sajat.c:48:59: error: invalid operands to binary % (have ‘double’ and ‘int’)
printf("minutes: %.0lf dec %.0lf deg %06.3lf'\n",t/100,(d%100),m);

Második menetnél d%100-at írtam, úgy is hiba van.

---
--- A gond akkor van, ha látszólag minden működik. ---
---

Igy probald: ((long)d) % 100

----------------------
"ONE OF THESE DAYS I'M GOING TO CUT YOU INTO LITTLE PIECES!!!$E$%#$#%^*^"
--> YouTube csatornám

Kipróbáltam, lefordult.
Viszont kétszámjegyű érték helyett egy ilyet kaptam:
387168830465509120

Aszem szűkszavú voltam az elején, a teljes kódrészlet ami számol, így néz ki:

d+=m/60.0+s/3600.0;
t=floor(d);
m=(d-t)*60.0;d=t;
printf("%.0lf dec %.0lf deg %06.3lf'\n",t/100,((long)d) % 100,m);
t=floor(m);
s=(m-t)*60.0;m=t;

Ebben a floor() tetszik különösen, mert ez pont azt teszi, hogy az egyeseket meg a tizeseket távolítja el a sokjegyű számból. Pont ennek az ellenkezőjét szeretném

---
--- A gond akkor van, ha látszólag minden működik. ---
---

Par komment:
- Ha vmelyik operandus (d) az ege'sz, akkor ne double-kent tarold, hanem egeszkent (int, long, short, etc, amelyikbe belefe'r).
- Ha me'gis double-ba kell tarolnod, akkor: a/ cast-olj, b/ hasznald az fmod() fuggvenyt.

Ha egészet osztok egésszel c-ben, akkor egész típusút kapok, valami ilyesmi állhat emögött. Ha jól emlékszem

Egyébként tényleg doubleként írtam:
double d,m=0,s=0,t;

---
--- A gond akkor van, ha látszólag minden működik. ---
---

Teljesen kapcsold ki a lebegőpontos számokat, most nem róluk van szó.

int i=497, j=76;

printf ("%d/%d=%d %d%%%d=%d\n", i, j, i/j, i, j, i%j);

Szerk: most látom, hogy idővel akarsz számolni, csak belekavartad magad. Legjobb lenne, ha meggyónnád, hogy mi is az, amit igazából akarsz.

Tulajdonképpen az idő is hasonló, de ez inkább 60-as számrendszer mint 12-es vagy 24. Szögekkel számolok, ami percekben van mérve. Végeredményben tök mindegy, mindkettő megrögzült számrendszere mezoporámiai eredetű :)

---
--- A gond akkor van, ha látszólag minden működik. ---
---

# include stdio.h // a stdio.h "kacsacsőrök" között de nem látszik, a html form,ázások miatt.

void main()
{
int c=12345;
printf("c=%d\n",c);
c=c%100;
printf("c=%d\n",c);
}

ek@ic7:~$ gcc s.c
ek@ic7:~$ ./a.out
c=12345
c=45
ek@ic7:~$

csak integer-rel működik.
------
3 fajta matematikus létezik. Aki tud számolni, és aki nem.

<: &lt;
>: &gt;

& jelhez meg &amp;...

----------------
Lvl86 Troll, "hobbifejlesztő" - Think Wishfully™

Sikerült!

A teljes kódrészletem, ami pont szép kimenetet ad:

d+=m/60.0+s/3600.0;
t=floor(d);
m=(d-t)*60.0;d=t;

int c=d;
/*printf("c=%d\n",c); */
c=c%100;
/* printf("c=%d\n",c); */
printf("minutes: %.0lf %d dec %.0lf deg %06.3lf'\n",t/100,c,m);

t=floor(m);
s=(m-t)*60.0;m=t;

return 0;

/* Köszönöm szépen! */

---
--- A gond akkor van, ha látszólag minden működik. ---
---

Szívesen.

------
3 fajta matematikus létezik. Aki tud számolni, és aki nem.

Helyesen:
&lt;stdio.h&gt;
ami így fog kinézni:
<stdio.hu>

Esetleg így:

<stdio.h>

;)


tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

magyarok vagyunk, nekünk, magyar stdio jár ;-)
(és több mint egy percig nézegettem, mi a különbség)

ls -l /usr/include/*.h |\
awk 'BEGIN
{FS=" "}\
{print $9"u"}'
# :-)

---
--- A gond akkor van, ha látszólag minden működik. ---
---

Sőt, 'ls -1' is jó:

ls -1 /usr/include/*.h | while read -r FILENAME; do
    printf '%su\n' "$FILENAME"
done

Így egyszerűbb:

ls -1 /usr/include/*.h | sed 's/$/u/'


tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Ez tényleg jobb. Nem ismertem.

---
--- A gond akkor van, ha látszólag minden működik. ---
---

+1

Na ezt legalább megtanultam. :D A magyar stdio.hu miatt legalább megjegyzem.

------
3 fajta matematikus létezik. Aki tud számolni, és aki nem.