Advertisement
a53

cifrab

a53
Jun 29th, 2019
210
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.53 KB | None | 0 0
  1. #include <fstream>
  2. #include <cstring>
  3. using namespace std;
  4. #define NMax 100000
  5. typedef int Huge[NMax+3];
  6. int b; /// baza
  7.  
  8. int Mod(Huge A,int X) /// Intoarce A%X
  9. {
  10. int R=0;
  11. for(int i=A[0];i;--i)
  12. R=(b*R+A[i])%X; /// b*R este restul anterior inmultit cu baza
  13. return R;
  14. }
  15.  
  16. int main()
  17. {
  18. char s[100001];
  19. ifstream f("cifrab.in");
  20. ofstream g("cifrab.out");
  21. f.getline(s,100001);
  22. int L=strlen(s);
  23. Huge N;
  24. N[0]=L;
  25. for(int i=L-1;i>=0;--i) /// Aflu baza b si formez numarul in baza b
  26. {
  27. if(isdigit(s[i]))
  28. N[L-i]=s[i]-'0';
  29. else
  30. N[L-i]=s[i]-'A'+10;
  31. if(N[L-i]>b) /// Aflam cifra maxima si o memoram in b
  32. b=N[L-i];
  33. }
  34. /// Un numar natural scris in baza b se divide cu b–1 daca si numai daca suma cifrelor sale este un numar multiplu de b-1
  35. int sumcif=0;
  36. for(int i=L-1;i>=0;--i) /// Calculam restul impartirii sumei tuturor cifrelor lui N la baza-1 (adica b)
  37. {
  38. if(isdigit(s[i]))
  39. N[L-i]=s[i]-'0';
  40. else
  41. N[L-i]=s[i]-'A'+10;
  42. sumcif+=N[L-i];
  43. if(sumcif>=b)
  44. sumcif-=b;
  45. }
  46. ++b; /// baza va fi mai mare cu 1 fata de cifra maxima
  47. int sol=Mod(N,b-1);
  48. g<<b<<'\n';
  49. if(sumcif==0)
  50. {
  51. if(b<=10)
  52. g<<b-1;
  53. else
  54. g<<(char)('A'-10+b-1);
  55. return 0;
  56. }
  57. if(b<=10)
  58. g<<sol;
  59. else
  60. if(sol>=10)
  61. g<<(char)('A'-10+sol);
  62. else
  63. g<<sol;
  64. return 0;
  65. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement