Probleme de informatică
Clasa a IX-a
Elementele de bază C++ (46)
Subprograme predefinite (1)
Fişiere text (2)
Algoritmi elementari (109)
Tablouri unidimensionale (83)
Tablouri bidimensionale (64)
Probleme diverse (13)
Clasa a X-a
Subprograme (funcții) (87)
Şiruri de caractere (49)
Tipul înregistrare (26)
Recursivitate (57)
Alocarea dinamică a memoriei (2)
Liste înlănţuite (25)
Algoritmul lui Lee (1)
Clasa a XI-a
Metoda "Divide et impera" (12)
Metoda Backtracking (85)
Metoda Greedy (6)
Programare dinamică (18)
Grafuri neorientate (37)
Grafuri orientate (38)
Arbori (33)
Clasa a XII-a
Elemente de bază C# (32)
POO în C# (13)
Programare vizuală în C# (11)
Examen de bacalaureat
Competențe digitale
Examen de atestat
Admitere UBB (18)
Inmultirea numerelor mari
Numerele naturale cu foarte multe cifre se pot memora cu ajutorul vectorilor. Sa se calculeze si sa se afiseza produsul a doua numere naturale memorate in 2 vectori a si b cu n si respectiv m elemente.
Cifrele numerelor se vor introduce de la tastatura fara spatiu intre ele.
Exemplu: vezi figura alaturata

#include<iostream>
using namespace std;

void citire(int a[1000], int &n)
{
	char cif;
	int i;
	cin>>n;
	for(i=n;i>=1;i--)
		{ cin>>cif;
	      a[i]=cif-48;//transform sin cifra in numar (cifa este caracter)
		} 
}

void aduna(int a[1000], int n, int b[1000], int m, int s[2000], int &p)//s=a+b
{   int i,t,c; 
	if(n<m) 
		{ p=m;//nr max de cifre
	      for(i=n+1;i<=m;i++) a[i]=0;//completez cu 0
		}
	else { p=n;//nr max de cifre 
	       for(i=m+1;i<=n;i++) b[i]=0;//completez cu 0
 	     }
	
	t=0;
	for(i=1;i<=p;i++)
	{
		c=a[i]+b[i]+t; //adun cifra cu cifra
		s[i]=c%10;//restul se pune
		t=c/10;//catul e transport
	}
	if(t==1)// a ramas transport
	{
		p++;//avem cu o cifra mai mult
		s[p]=t;
	}
}

void prod(int a[1000], int n, int cif, int s[1000], int &p)//s=a*cif inmultirea cu o cifra
{   int i,t,c;
	p=n;
	t=0;
	for(i=1;i<=p;i++)
	{
		c=a[i]*cif+t;//inmultesc cifra cu cifra
		s[i]=c%10;//restul
		t=c/10;//transportul
	}
	if(t>0)// a ramas trasnport
	{
		p++;
		s[p]=t;
	}
}

void prod10(int a[1000], int n, int s[2000], int &p, int x) //inmulteste pe s cu 10 la x
{
	int y,j;
	for(j=1;j<=n;j++) s[j]=a[j];
	p=n;
	for(y=1;y<=x;y++) //deplasez spre stanga cu x pazitii si completez cu 0
		{
		   p++;
		   for(j=p;j>=1;j--) s[j]=s[j-1];//deplasase
		}
	for(j=1;j<=x;j++) s[j]=0;//completare cu 0
}

int main()
{
	int n,m,a[1000],b[1000],s[2000],ss[2000],ps,p,i,pp[2000],k,x,y,j;
	k=0;
	x=0;
    citire(a,n);
	citire(b,m);
	for(i=1;i<=m;i++) //pentru fiecare cifra a lui b
	{   
		prod(a,n,b[i],s,p);//inmultesc a cu cifra din b
		prod10(s,p,ss,ps,x);//inmulteste pe s cu 10 la x
		x++;//tine minte cu cate pozitii am de mutat
		aduna(ss,ps,pp,k,pp,k);//adun la pp pe s  pp este suma , iar s este produsul cu o cifra mutat cu cat trebuie 
	}
	for(i=k;i>=1;i--) cout<<pp[i];
	return 0;
}

13 nov 2018
Site-ul conține 868 de probleme rezolvate
Copyright © 2009-2018 Muresan Vasile Ciprian