c-priklad prvre vacsie sumerne cislo od zadaneho cisla
Ahoj ako uz nadpis napoveda ide o program ktory po zadani lubovolneho cisla (do 10 cifier) najde prve vacsie sumerne cislo od zadaneho teda ja napr. zadam 1440 a napise mi to 1441. Neviete kde mozem mat chybu mam do odovzdania zadania malo casu a dnes mi to nejako nemysli prosim poradte
#include <stdio.h>
#include <stdlib.h>
#include "skola.h"
//Vytvorte program, ktorý po zadaní prirodzeného èísla "n" nájde prvé, od neho väèšie "súmerné" èíslo,
//t.j. èíslo, ktoré je z obidvoch strán (spredu aj zozadu ) rovnaké!
//Napr. pre n=144 je súmerné èíslo 151
int main()
{
const int MAX=999999;
const int POCET=10;
int cifry_pole[POCET];
int cislo=0;
int vacsie_cislo=0;
int cifry=0;
int i=0;
printf("Zadaj prirodzene cislo maximalne 10 ciferne: ");
scanf("%d",&cislo);
vacsie_cislo=cislo;
while(vacsie_cislo<MAX)
{
vacsie_cislo++;
for(i=0;vacsie_cislo>0;i++,cifry++)
{
cifry_pole[i]=vacsie_cislo%10;
vacsie_cislo/=10;
printf("%d\n",cifry_pole[i]);
}
for(i=0;i>cifry;i++,cifry--)
{
if(cifry_pole[i]==cifry_pole[cifry])
{
printf("Vacsie sumerne cislo od zadaneho je: %d",vacsie_cislo);
return 0;
}
}
}
return 0;
}
vacsie_cislo/=10;
Tohle vacsie_cislo bys měl pouze zvyšovat o jedničky.
V c-neprogramujem, preto Ti chybu hľadať nebudem, ale zaujal ma tento príklad.
Myšlienka ako by som to riešil ja:
Keďže sa jedná o Palindrome - môže to byť slovo, fráza, číslo, postupnosť znakov..., ktoré musí byť interpretované rovnako z obidvoch strán, tzn. aj z predu aj zo zadu, riešil by som to porovnávaním ako text-string.
Náčrt pre pochopenie:
Zadané číslo napr. 139 zvýšim o jedničku, tzn. bude z toho 140. Toto číslo prevediem na text a porovnám ho s otočeným textom odzadu
140 otočím, dostanem 041, porovnám text: 140 <> 041 nezhoduje sa, idem ďalej - zvýšim číslo (140) o jedničku, dostanem 141
141 otočím, dostanem 141, porovnám text: 141 = 141- mám výsledok - končím...
tento jednoduchý algoritmus sa dá krásne rozložiť do malých celkov a testovať v cykle napr. while do...
Já bych to naopak řešil stále jako čísla, když už jde o čísla. A vynechal bych i to pole pro ukládání jednotlivých číslic, jde to v klidu bez něj.
Asi áno..., mne sa v Delphi dá lepšie/jednoduhšie otočiť-porovnávať string...
porovnavat deplhi a C chce vela odvahy :D
Nikto nič neporovnáva...
Hlavne, že delphi píšeš s malým "d" a C s veľkým "C" - asi si chcel vyzdvihnúť "veľkosť" toho jazyka?
milujem taketo dedukcie. ja z lenivosti pisem na kompe vsetko malym a bez diakritiky (pokial nejde o formalne texty). a "C" som dal velkym, aby som to opticky oddelil od spojky "a" kedze to je len jedno pismeno.
No dobre. Hneváš sa?
to urcite nie ... a ty?
Jednodušší možná. V C# bych to viděl takhle:
No uz to vyzera lepsie ked dam 120 tak mi to 121 najde :D ale pri takych dalej od vysledku to hlada a hlada
vyhod vsetky zbytocne printf z cyklov a pojde to milionkrat rychlejsie
o to nejde ide to dost rychlo dam nie 120 ale 119 a hlada a hlada ... podlamna 3ciferne cislo by to malo najst hned nie? Lebo ja som na vysledok cakal take 3min
while(delitel>0)
{
cifry[++i]=delitel%10;
delitel/=10;
}
- neinicializoval si i (pre dalsie prechody cyklom!). A ta inicializacia na -1 je tiez dementna. Normalne sa to robi
i=0;
while(delitel>0)
{
cifry[i++]=delitel%10;
delitel/=10;
}
ja kedze som spravne lenivy by som to napisal takto:
for(i=0; delitel>0; delitel/=10)
cifry[i++]=delitel%10;
P.S. a potom samozrejme zmenit vsetky nasledne testy oproti i, z <=i na <i, a priradenie k=i-1 pretoze tak je to logicke v C (0-based index) a i je pocet cifier.
a to "j<=i/2" musi ostat ako <= pretoze to musi ist az po prostrednu cifru ak je pocet cifier neparny.
P.S. resp. sorry je to jedno, prostredna cifra sa porovnava sama so sebou :)
ok spravil som to podla teba ako si napisal poskusal som zjednodusil printf dal prec no ostalo mi toto ale stale tam je ta vada :D 120 mi ide ale napr 149 nic
Stejna vec jak pre i plati aj pre premennu vysledok. Nauc sa nespoliehat na nejake defaultne hodnoty premennych. V bode kde robit test tak nastavim vsetky mozne hodnoty, t.j.
vysledok=ANO; //assume success
for(j=0,k=i;j<=i/2;j++,k--)
{
if(cifry[j]!=cifry[k])
vysledok=NIE;
}
A nezmenil si to
k=i na k=i-1
pristupujes mimo pola
A este by som zmenil aj to j<=i/2 na j<i/2
Dovod: ak by i bolo 0, tak by si s tym k=i-1 pristupoval na neplatnu adresu co by malo za nasledok exception a zavretie aplikacie windowsami. Pri i=0 bude j<i/2 neplatne takze nebudes nikam pristupovat.
Ked robis taketo veci vzdy sa snaz okamzite mysliet aj na hranicne hodnoty ktore tam mozu nastat, a aby si za ziadnych okolnosti nepristupoval niekam mimo pole (v pripade potreby davat dalsie if)
A este uplne nakoniec ked chces vediet jak by som ten test napisal ja (lebo som spravne lenivy :D) tak uplne bez premennej vysledok:
ako bonbonik je ze funguje to spravne aj pre jednociferne cisla (jednociferne je tiez symetricke :)
resp. este malicka uprava, takto by som to napisal, je to citatelnejsie:
A este aj v tom
for(i=0; delitel<0; delitel/=10)
mas to delitel<0 naopak. Ja som pisal delitel>0
uz viem kde je chyba tie cifry tam sa uklada cim dalej tym viac prvkov pola. ako spravim aby som cele pole vynuloval ako na zaciatku na konci cyklu while??
Netrep kraviny. Ty snad vobec nechapes co robis. Este ani copy-paste nezvladas.
Si tie moje zmeny asi vobec neskompiloval. To bol tvoj povodny problem s i.
Ano mas pravdu i som tam nakonci cyklu zabudol dat na povodnu hodnotu aj ten vysledok bol treba tak dat. Uz som tie tvoje rady do toho projektu aplikoval :) dakujem moc za pomoc vsetko ide ako ma.
Len tam radsej nechaj to tvoje while namiesto mojho for, lebo ucitel to moje for nemusi pochopit
V podstate mozes zobrat tvoj povodny program z dotazu, a opravit len to co pisal wikan, a potom len pridat 2 riadky na spravne miesta v cykle alebo na zaciatok cyklu
i = -1;
vysledok = ANO;
a musi to fungovat tiez.
P.S. aha sorry ne, v dotaze si toho mal blbo viac. Nechaj to uz tak. Pripadne zmen to moje for zas na tvoje while
V Javě to jde celkem rychle:
já bych to řešil textově.
rozdělit podle počtu číslic na sudá a lichá. U lichých "vynechat" prostřední a v obráceném gardu sepsat číslice zleva doprava. V podstatě jeden if a pak už jen otročina.
obecně:
edit: místo IFu se dá použít dělení reálných čísel a zaokrouhlení.
edit2: nepochopil jsem zadání. ignorujte.
"Trochu" efektívnejšia verzia:
Omg. Nějak moc ḱódu, né?