Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2008
    Messaggi
    12

    [C] funzione cambiabase!!!! URGENTE:(

    ciao ragazzi,
    entro stasera devo scrivere un programma...in base 10...funziona..ma se provo a cambiare base non riesco a capire perchè entra in loop infinito...ecco la mia Funzione cambiabase, ho usato una funzione potenza di dieci perchè pow in math.h non mi faceva usare variabili!

    K è la base in cui voglio cambiare il mio numero...ed è specificata nel Define


    int cambiabase( int n){
    int h = 0,sum = 0;

    for( h = 0 ; n > 0 ; h++){
    sum = sum + (n%K)*potenzadidieci(h);
    n = n/K;
    }
    return sum;
    }


    e questa e il codice della funzione potenza di dieci:
    int potenzadidieci(int n) {
    int i, m=1;
    for ( i = 0; i < n; i++ )
    m = m*10;
    return m;
    }


    trovate errori??
    con numeri piccoli funziona..ma gia sui 5000 si incasina...
    se magari avete una funzione cambiabase gia fatta...vi sarei grato se me la postasse xD

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,465
    Intanto, sappi che non c'è nulla di "urgente" in questo forum ... si risponde quando e se si vuole ... (vedi regolamento).

    Detto questo, qual e' il problema che hai di preciso?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Apr 2008
    Messaggi
    12
    scusatemi...ma è una settimana che ci lavoro e quindi sto x gettare la spugna

    cmq... questi sono problema e mia risoluzione..in base 10 con K quindi = 10...è tt ok! ma se metto base 2 entra all infinito
    /*Scrivere un programma C che stampi il piu' piccolo numero naturale che rispetta le seguenti condizioni:

    1. Il numero deve essere la somma di 12 primi consecutivi (per esempio:
    1336=89+97+101+103+107+109+113+127+131+137+139+83)

    2. Se prendiamo il numero (chiamiamolo n) rappresentato in base 10, e consideriamo il numero ottenuto invertendo l'ordine delle sue cifre (chiamiamolo n'), n-n' deve avere le stesse cifre di n (cioè lo si deve poter ottenere permutando le cifre di n)
    Per esempio, 990180 è un numero di questo tipo: 990180-81099=909081. */
    #include <stdio.h>
    #include <stdlib.h>
    #define K 10

    int sommaprimi(int n);
    int ribalta(int n);
    int contacifre(int n);
    int cambiabase(int n);
    int potenzadidieci(int n);
    int controllo(int n,int n2);



    /*---------inizio main--------------------------------------*/
    int main(){
    int somma = 0, a = 0, c = 0,h, num = 1, rev, sum;
    //inizializzo il numero da qui partire


    do{
    somma = sommaprimi(c);
    num = cambiabase(somma);
    rev = ribalta(num);
    sum = num - rev;
    c++; }
    while( controllo(num,sum) == 0 ) ;

    printf("Il numero pazzoide che ci avete richiesto è:%d\n", num);









    return 0;
    }

    int sommaprimi(int n){
    int c = 0, sum = 0, i ;
    while (c < 12){
    for(i = 2; i < n && n % i ; i++)
    ;
    if (i == n){
    sum += i;
    c++;
    }
    n++;
    }
    return sum;
    }

    int controllo(int n,int n2){ // FUNZIONE più importante
    int cifre[] = {0,0,0,0,0,0,0,0,0,0};
    int cifre2[] = {0,0,0,0,0,0,0,0,0,0};
    int y = 0;
    do{
    cifre[n%10]++;

    n/=10;

    }

    while( n!=0 );

    do{
    cifre2[n2%10]++;

    n2/=10;

    }

    while( n2 !=0 );

    for( y = 0; y < 10 ; y++)
    {
    if(cifre[y] != cifre2[y])
    return 0;
    }
    return 1;
    }
    int ribalta (int n) {
    int c, somma = 0;
    for ( c = contacifre(n) - 1; c >= 0; c-- ) {
    somma = somma + ( n % 10 ) * potenzadidieci(c);
    n = n / 10;
    }
    return somma;
    }

    int cambiabase( int n){
    int h = 0, sum = 0;

    for( h = 0 ; n > 0 ; h++){
    sum = sum + (n%K)*potenzadidieci(h);
    n = n/K;
    }
    return sum;
    }

    int potenzadidieci(int n) { // POW in math.h non mi accettava variabili
    int i, m=1;
    for ( i = 0; i < n; i++ )
    m = m*10;
    return m;
    }


    int contacifre(int n){
    int p=1;
    while( n > 10){
    n /= 10;
    p++;
    }
    return p;

    }
    Codice PHP:
    Codice 

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,465
    Se non usi i tag CODE non si capisce nulla del codice ...

    Le due funzioni lavorano correttamente ... ho provato con K=2 e K=16

    La pow funziona correttamente (accetta parametri double e quindi serve un cast)

    Per il resto, non ho capito quasi nulla ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it
    Registrato dal
    Apr 2008
    Messaggi
    12
    funzionano? cioè se metti K = 2 t trova il num in base 2?

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,465
    Ho provato con qualche valore ma funziona ... perche' tu non l'hai provato?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Utente di HTML.it
    Registrato dal
    Apr 2008
    Messaggi
    12
    si certo, ma con valori altini non va...

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,465
    Beh ... sicuramente oltre 1023 non credo ...

    Con 1024 la potenza di 10 vale 10 miliardi e questo valore non puo' essere rappresentato con un intero a 32 bit.

    Devi usare un intero a 64 bit o un altro tipo di dato ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  9. #9
    Utente di HTML.it
    Registrato dal
    Apr 2008
    Messaggi
    12
    ho messo long int, ma oltre 1023...non converte lo stesso

    ps. anche con unsigned long int...non converte numeri oltre il 1023!

  10. #10
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,465
    Originariamente inviato da giggikr
    ho messo long int, ma oltre 1023...non converte lo stesso

    ps. anche con unsigned long int...non converte numeri oltre il 1023!
    Il long int è uguale all'int ...

    L'unsigned long int non risolve il problema lo stesso ...

    O lavori con un int64 o con un double ... oppure ti accontenti, dal punti di vista teorico, è corretto ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.