Questo è il programma che ho realizzato, ci ho messo qualche commento per riuscire a comprenderlo meglio. Come posso migliorare il tempo di esecuzione? C’era qualche modo per farlo più semplicemente a cui non ho pensato?
Link del problema:CMSocial - a social coding app
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
// input data
int A, B;
long long K;
char s[20];
int main() {
assert(3 == scanf("%d %d %lld", &A, &B, &K));
int c=2,n,somma,check,i,j;
for(i=0;i<K;c++){
n=A*c; //n è un numero multiplo di A, c parte da 2 ed ogni volta che il ciclo riinizia aumenta di 1
sprintf(s,"%d",n); //lo mette in una stringa
somma=0;
check=0;
for(j=strlen(s)-1;j>=0;j--){ //controlla la stringa partendo dalla prima cifra
somma+=(int)s[j]-48; //fa la somma delle cifre
if(s[j]=='0' || somma>B){ //controlla le cifre singolarmente, e quando la cifra è 0 oppure la somma delle cifre supera B esce
check=1;
break;
}
}
if(somma!=B){ //in caso non ci siano 0 nel numero ma la somma non è B
check=1;
}
if(check==0) i++; //se nessuno dei due precedenti if risulta vero vuol dire che il numero rispetta le condizioni della traccia (essere multiplo di A e la somma delle cifre fa B)
if(i==K) break; //quando abbiamo trovato il K-esimo numero della sequenza esce dal ciclo principale e fa apparire a schermo la soluzione
}
printf("%s\n", s); // print the result
return 0;
}