Răspuns :
#include <iostream>
#include <fstream>
using namespace std;
struct numar_prop{
int numar_curent;
int pozitie_curenta;
int nr_cifre;
};
struct numar_prop cifra_curenta(int n){
struct numar_prop np;
int rez=0,nr_cifre=1,nr_numere=9;
while(n>=nr_numere*nr_cifre){
n=n-nr_numere*nr_cifre;
rez=rez+nr_numere;
nr_numere=nr_numere*10;
nr_cifre++;
}
np.numar_curent=n/nr_cifre;
np.pozitie_curenta=n%nr_cifre;
if(np.pozitie_curenta==0){
np.pozitie_curenta=nr_cifre;
}
else{
np.numar_curent++;
}
np.numar_curent=np.numar_curent+rez;
np.nr_cifre=nr_cifre;
return np;
}
int obtine_nr_cifre(int n){
int nr_cifre=0;;
while(n>0){
n=n/10;
nr_cifre++;
}
return nr_cifre;
}
//poz este pozitia de la care incepe suma de cifre
//este numerotata de la 1 la nr_cifre
//dir da directia de adunare a cifrelor: dir=0, dreapta stanga, dir=1, stanga dreapta
int suma_cifre(int n,int nr_cifre,int poz,int dir){
int s=0,poz_ocupate=0;
if(dir==0){
while(poz_ocupate<nr_cifre-poz+1){
s=s+n%10;
n=n/10;
poz_ocupate++;
}
}
else{
while(n>0){
if(poz_ocupate>nr_cifre-poz-1){
s=s+n%10;
}
n=n/10;
poz_ocupate++;
}
}
return s;
}
int suma_cifre_interval(int p,int q){
struct numar_prop np_p,np_q;
int i,s=0;
np_p=cifra_curenta(p);
np_q=cifra_curenta(q);
s=s+suma_cifre(np_p.numar_curent,np_p.nr_cifre,np_p.pozitie_curenta,0);
for(i=np_p.numar_curent+1;i<np_q.numar_curent;i++){
s=s+suma_cifre(i,obtine_nr_cifre(i),1,0);
}
s=s+suma_cifre(np_q.numar_curent,np_q.nr_cifre,np_q.pozitie_curenta,1);
return s;
}
int main(){
int n,i;
ifstream fis("sumo.in");
ofstream fos("sumo.out");
fis>>n;
int p[n],q[n];
for(i=0;i<n;i++){
fis>>p[i]>>q[i];
fos<<suma_cifre_interval(p[i],q[i])<<endl;
}
return 0;
}
#include <fstream>
using namespace std;
struct numar_prop{
int numar_curent;
int pozitie_curenta;
int nr_cifre;
};
struct numar_prop cifra_curenta(int n){
struct numar_prop np;
int rez=0,nr_cifre=1,nr_numere=9;
while(n>=nr_numere*nr_cifre){
n=n-nr_numere*nr_cifre;
rez=rez+nr_numere;
nr_numere=nr_numere*10;
nr_cifre++;
}
np.numar_curent=n/nr_cifre;
np.pozitie_curenta=n%nr_cifre;
if(np.pozitie_curenta==0){
np.pozitie_curenta=nr_cifre;
}
else{
np.numar_curent++;
}
np.numar_curent=np.numar_curent+rez;
np.nr_cifre=nr_cifre;
return np;
}
int obtine_nr_cifre(int n){
int nr_cifre=0;;
while(n>0){
n=n/10;
nr_cifre++;
}
return nr_cifre;
}
//poz este pozitia de la care incepe suma de cifre
//este numerotata de la 1 la nr_cifre
//dir da directia de adunare a cifrelor: dir=0, dreapta stanga, dir=1, stanga dreapta
int suma_cifre(int n,int nr_cifre,int poz,int dir){
int s=0,poz_ocupate=0;
if(dir==0){
while(poz_ocupate<nr_cifre-poz+1){
s=s+n%10;
n=n/10;
poz_ocupate++;
}
}
else{
while(n>0){
if(poz_ocupate>nr_cifre-poz-1){
s=s+n%10;
}
n=n/10;
poz_ocupate++;
}
}
return s;
}
int suma_cifre_interval(int p,int q){
struct numar_prop np_p,np_q;
int i,s=0;
np_p=cifra_curenta(p);
np_q=cifra_curenta(q);
s=s+suma_cifre(np_p.numar_curent,np_p.nr_cifre,np_p.pozitie_curenta,0);
for(i=np_p.numar_curent+1;i<np_q.numar_curent;i++){
s=s+suma_cifre(i,obtine_nr_cifre(i),1,0);
}
s=s+suma_cifre(np_q.numar_curent,np_q.nr_cifre,np_q.pozitie_curenta,1);
return s;
}
int main(){
int n,i;
ifstream fis("sumo.in");
ofstream fos("sumo.out");
fis>>n;
int p[n],q[n];
for(i=0;i<n;i++){
fis>>p[i]>>q[i];
fos<<suma_cifre_interval(p[i],q[i])<<endl;
}
return 0;
}
Vă mulțumim că ați vizitat platforma noastră dedicată Informatică. Sperăm că informațiile oferite v-au fost utile. Dacă aveți întrebări sau aveți nevoie de asistență suplimentară, nu ezitați să ne contactați. Așteptăm cu nerăbdare să vă revedem și nu uitați să ne salvați în lista de favorite!