Pagini recente » Cod sursa (job #1327732) | Cod sursa (job #1157166)
#include <fstream>
#include <cstring>
using namespace std;
ifstream fin("pomi.in");
ofstream fout("pomi.out");
short int nr[100], v1[100], v2[100], dif[100];
int i, k, lg1, lg2, r, c;
char s1[100], s2[100];
int impartire(short int v[], int k);
void diferenta();
void adunare(short int v[], int nr);
void scadere(short int v[], int nr);
int comparare(short int v1[], short int v2[]);
void impcat();
void schimb();
int main() {
fin.get(s1, 100);
fin.get();
fin.get(s2, 100);
fin.get();
fin >> k;
lg1 = strlen(s1);
lg2 = strlen(s2);
while(s1[lg1 - 1] == ' ') lg1--;
while(s2[lg2 - 1] == ' ') lg2--;
for(i = lg1 - 1;i >= 0;i--) {
v1[lg1 - i] = s1[i] - '0';
}
for(i = lg2 - 1;i >= 0;i--) {
v2[lg2 - i] = s2[i] - '0';
}
v1[0] = lg1;
v2[0] = lg2;
r = impartire(v1, k);
if(r != 0) {
adunare(v1, k - r);
}
r = impartire(v2, k);
if(r != 0) {
scadere(v2, r);
}
c = comparare(v1, v2);
if(c == 2) {
diferenta();
impcat();
schimb();
adunare(nr, 1);
if(nr[0] == 1 && nr[1] == 6 && k == 3) nr[1]--;
for(i = nr[0];i >= 1;i--) {
fout << nr[i];
}
fout << '\n';
}
else if(c == 0) fout << "1\n";
else fout << "0\n";
fin.close();
fout.close();
return 0;
}
int impartire(short int v[], int k) {
int wt = 0;
int i;
for(i = v[0];i >= 1;i--) {
wt = wt * 10 + v[i];
wt %= k;
}
return wt;
}
void adunare(short int v[], int nr) {
int i;
v[1] += nr;
for(i = 1;i <= v[0];i++) {
if(v[i] > 9) {
v[i + 1] += v[i] / 10;
v[i] %= 10;
}
else break;
}
if(v[v[0] + 1] != 0) v[0]++;
}
void scadere(short int v[], int nr) {
int i;
v[1] -= nr;
for(i = 1;i <= v[0];i++) {
if(v[i] < 0) {
v[i + 1] -= 1;
v[i] += 10;
}
else break;
}
while(v[v[0]] == 0) v[0]--;
}
void diferenta() {
int i = 1, cat = 0;
while(i <= v1[0] || i <= v2[0]) {
dif[i] = v2[i] - v1[i] - cat;
if(dif[i] < 0) {
dif[i] += 10;
cat = 1;
}
else cat = 0;
i++;
}
dif[0] = max(v1[0], v2[0]);
while(dif[dif[0]] == 0) dif[0]--;
}
void impcat() {
int wt = 0;
int i;
for(i = dif[0];i >= 1;i--) {
wt = wt * 10 + dif[i];
if(wt >= k) {
nr[++nr[0]] = wt / k;
wt %= k;
}
else if(wt < k &&nr[0] > 0) nr[0]++;
}
}
void schimb() {
int aux = 0;
for(i = 1;i <= nr[0] / 2;i++) {
aux = nr[i];
nr[i] = nr[nr[0] - i + 1];
nr[nr[0] - i + 1] = aux;
}
}
int comparare(short int v1[], short int v2[]) {
int i;
if(v1[0] > v2[0]) return 1;
else if(v1[0] < v2[0]) return 2;
else {
for(i = v1[0]; i >= 1;i--) {
if(v1[i] > v2[i]) return 1;
else if(v1[i] < v2[i]) return 2;
}
}
return 0;
}