Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno 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;
}
Jsou zobrazeny jen nové odpovědi. Zobrazit všechny
Předmět Autor Datum
V Javě to jde celkem rychle: static void pocitej(int startNum) { startNum++; if (Objects.equals(""… nový
MaSo 20.11.2013 11:04
MaSo
já bych to řešil textově. rozdělit podle počtu číslic na sudá a lichá. U lichých "vynechat" prostře… nový
touchwood 20.11.2013 12:55
touchwood
"Trochu" efektívnejšia verzia: #include <stdio.h> #include <stdlib.h> #include <string.h> int main(… nový
los 20.11.2013 20:06
los
Omg. Nějak moc ḱódu, né? :-) poslední
MaSo 21.11.2013 09:44
MaSo

V Javě to jde celkem rychle:

    static void pocitej(int startNum) {
        startNum++;
        if (Objects.equals("" + startNum, new StringBuilder("" + startNum).reverse().toString())) {
            System.out.println(startNum);
        } else {
            pocitej(startNum);
        }
    }

:-)

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ě:

pocet = zjisti_počet znaků (string)
if pocet mod 2 = 0
   then vystup = substring (1, pocet div 2, string) #sebere prvni pulku (od prvniho znaku)
   else vystup = substring(1, pocet div 2 + 1, string)  #sebere prvni pulku a prostřední znak
endif 
for i in (pocet div 2) to 1 do 
     vystup = vystup + substring (i, 1, string)  #zpetne prida po znaku levou stranu
next
   

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:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
	char number[11], buffer[6];
	int len, size, index, left, leftRev, right;

	printf("Zadaj cislo (max. 10 cifier): ");
	fgets(number, 11, stdin);
	len = strlen(number);
	if (number[len - 1] == '\n')
		number[--len] = 0;
	size = (len + 1) / 2;
	index = len / 2;
	buffer[size] = 0;
	strncpy(buffer, number + index, size);
	right = atoi(buffer);
	strncpy(buffer, number, size);
	left = atoi(buffer);
	strrev(buffer);
	leftRev = atoi(buffer);
	if (right >= leftRev) {
		left++;
		itoa(left, number, 10);
		itoa(left, number + index, 10);
		strrev(number + index);
	} else
		strncpy(number + index, buffer, size);
	printf("%s\n", number);
	return 0;
}

Zpět do poradny Odpovědět na původní otázku Nahoru