Egy szám osztóinak az összege C nyelven?
Elakadtam mivel sehogy sem tudom kiszedni a for ciklusból az osztót és hozzá adni az összeghez. Bármilyen számot beírok mindig 16-ot ír ki ezt miért lehet?
#include <stdio.h>
#include <stdlib.h>
void main() {
int i,szam,osszeg,n;
printf("irj be egy szamot: ");
scanf("%d",&szam);
for(i=1;i<=szam;i++){
if(szam % i == 0){
printf("%d \n",i);
osszeg+i;
}
}
printf("%d",osszeg);
return 0;
}
Ez a rész itt mi?
osszeg+i;
Cseréld le erre
osszeg+=i;
Le cseréltem a fentire de akkor sem adja jól vissza:
irj be egy szamot: 10
1
2
5
10
34
---
igazából csak az lenne itt a kérdés, hogy hogyan szedem ki a for ciklusból az osztót és adom hozzá egy változóhoz ami jelen esetben az osszeg
Az összeget inicializálhatnád alapból 1 értékre mivel minden szám osztható eggyel és önmagával tehát.
int összeg = szam+1;
A cilusváltozót 2 ről indítod és kevesebb mint szám ig mész
for(i = 2;i < szam; ++i)
Egyébként lehet még optimalizálni ha páros a számod akkor az osztó csak páros lehet így nincs értelme vizsgálni a páratlanokat ugyanez igaz fordított esetben is. Valamint elég a szám gyökéig keresni az osztókat hizs a gyök után ugyanazt vizsgálod csak fordítva.
"Valamint elég a szám gyökéig keresni az osztókat hizs a gyök után ugyanazt vizsgálod csak fordítva."
Helyesbítek nem elég mert itt össze kell őket adni
@7
Pedig jól írtad, elég a gyökéig menni, így minél nagyobb a vizsgálandó szám, relatíve annál hatékonyabb a kód. Megírta erre optimalizálva (lásd alább). Nem vizsgáltam, páros-e a szám, s az osztók közé most belevettem az 1-et és magát a számot is, stb, mert kizárólag csak azt akartam megmutatni, hogy - legalább egyféleképpen - megoldható, ha a "gyökigmenésig" optimalizálunk:
#include<stdio.h>
#include<math.h>
int main(){
int i, szam, osszeg = 0; float gyokSzam;
printf("Irj be egy szamot: ");
scanf("%d", &szam);
gyokSzam = sqrtf(szam);
for(i=1; i < gyokSzam; i++)
{
if(!(szam%i))
{
printf("%d\t%d\n",i, szam/i); osszeg += i + szam/i;
}
}
if(i == gyokSzam){ printf("%d\n", i); osszeg += i;}
printf("Osztok osszege: %d.\n",osszeg);
return 0;
}
További kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!