Buna ziua . Eu rezolv zilnic probleme la informatica in c++ folosind si c. Astazi rezolvind am gasit o problema mai complicata pentru mine. Eu rezolv de pe campion.edu.ro Problema se numeste anagramabil. Daca nu sunteti inregistrati atunci aici este textul:
Un număr se numeşte anagramabil dacă prin înmulţirea sa cu o cifră din sistemul de numeraţie zecimal mai mare decât 1 se obţine o anagramă a sa (adică un număr format din aceleaşi cifre cu numărul iniţial, eventual într-o altă ordine).
De exemplu, 1246878 este anagramabil deoarece înmulţindu-l cu 6 obţinem 7481268 (care este o anagramă a sa).
Cerinţă
Dat fiind un număr natural, să se verifice dacă este sau nu anagramabil şi dacă da să se afişeze în ordine crescătoare cifrele cu care poate fi înmulţit pentru a obţine o anagramă a sa.
Date de intrare
Fişierul de intrare anagramabil.in conţine pe prima linie numărul natural N.
Date de ieşire
Fişierul de ieşire anagramabil.out va conţine pe prima linie mesajul DA (dacă N este anagramabil), respective mesajul NU (în caz contrar). Dacă N este anagramabil, atunci pe cea de a doua linie vor fi afişate în ordine crescătoare cifrele cu care N poate fi înmulţit pentru a obţine o anagramă a sa.
Restricţii
◾0 < N < 500 000 000
Exemple:
anagramabil.in anagramabil.out anagramabil.in anagramabil.out
123456789 DA 100 NU
24578
Aici este codul meu care nu functioneaza corect(nu atrageti atentia la denumirea fisierului din codul meu sau la faptul ca folosesc c in interiorul file-lui c++ , nu este o problema problema este in logica codului:
#include
#include
#include
using namespace std;
FILE *f,*g;
unsigned long long int a[500],i=0,n,temp,cnt=0,go=0,j,b[500],t=0,s=0,da=0;
int main()
{
f = fopen("album.in","r");
fscanf(f,"%d",&n);
fclose(f);
temp = n;
while(temp)
{
i++;
a[i]=temp%10;
temp/=10;
cnt++;
}
for(i=2;i<=9;i++)
{
go = n*i;
for(j=1;j<=cnt;j++)
{
if(go%10==a[j])
{
go/=10;
j=1;
s++;
}
if(s==cnt)
{
t++;
b[t]=i;
da=1;
break;
}
}
}
if(da==1)
{
g=fopen("album.out", "w");
fprintf(g,"DA\n");
for(i=1;i<=t;i++)fprintf(g,"%d",b[i]);
fclose(g);
}
return 0;
}
Răspunsuri la întrebare
Răspuns de
2
Te pot ajuta trimitandu-ti codul meu in C de acum 3 ani...de fapt este o combinatie intre C si C++, numai ca eu citesc diferit fisierele. Incearca sa parcurgi pas cu pas si o sa observi diferentele fata de codul tau. Succes!
#include<cstdio> #include<algorithm> #include<cstring> using namespace std; int v[10],w[10],i,j,x,c,nr; long long n,p; int main() { bool ok,cod=false; freopen("anagramabil.in","r",stdin); freopen("anagramabil.out","w",stdout); scanf("%lld",&n); x=n; while(x) { c=x%10; v[c]=v[c]+1; x=x/10; } for (j=2;j<=9;j++) { ok=true; p=0; p=n*j; while(p) { c=p%10; w[c]=w[c]+1; p=p/10; } for(i=0;i<=9;i++) if(v[i]!=w[i]) ok=false; if (ok) {cod=true; nr=nr*10+j;} for(i=0;i<=9;i++) w[i]=0; } if (cod) {printf("DA\n");printf("%d",nr);} else printf("NU\n"); return 0; }
#include<cstdio> #include<algorithm> #include<cstring> using namespace std; int v[10],w[10],i,j,x,c,nr; long long n,p; int main() { bool ok,cod=false; freopen("anagramabil.in","r",stdin); freopen("anagramabil.out","w",stdout); scanf("%lld",&n); x=n; while(x) { c=x%10; v[c]=v[c]+1; x=x/10; } for (j=2;j<=9;j++) { ok=true; p=0; p=n*j; while(p) { c=p%10; w[c]=w[c]+1; p=p/10; } for(i=0;i<=9;i++) if(v[i]!=w[i]) ok=false; if (ok) {cod=true; nr=nr*10+j;} for(i=0;i<=9;i++) w[i]=0; } if (cod) {printf("DA\n");printf("%d",nr);} else printf("NU\n"); return 0; }
vic2002:
Mersi mult, eu tot folosesc fisiere din c cu elemente din c++
Alte întrebări interesante
Engleza,
8 ani în urmă
Limba română,
8 ani în urmă
Matematică,
9 ani în urmă
Limba română,
9 ani în urmă
Limba română,
9 ani în urmă
Fizică,
9 ani în urmă