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 pentru vizita pe site-ul nostru dedicat Informatică. Ne dorim ca informațiile furnizate să vă fi fost utile. Dacă aveți întrebări sau aveți nevoie de suport suplimentar, nu ezitați să ne contactați. Revenirea dumneavoastră ne bucură, iar pentru acces rapid, adăugați-ne la favorite!