Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<stdio.h>
- void soma (int n1[], int n2[],int a, int b, int *n, int d[])//esta é a funçao que realiza a soma dos vetores, os parametros indicados sao respectivamente os vetores n1 e n2, a posiçao onde esta alocada o ultimo algarismo de cada, um parametro n que sera utilizado para detectar qual posiçao é maior, e o vetor de saida
- {
- int i=0, aux=0, c;
- if(a>=b)//teste para verificar qual a maior posiçao
- *n=a;
- else{
- if(b>a)
- *n=b;
- }
- d[*n];
- for(i=0;i<=*n;i++){//realizaçao da soma
- c = n1[a-i]+n2[b-i]+aux;
- if (c>9){//se a soma de dois termos resultar em numero maior que 9 realiza o carry("vai-um") para o proximo algarismo, e fornece como resultado da soma somente o algarismo das unidades
- aux=c/10;
- c=c%10;
- }
- d[*n-i]=c;
- }
- }
- void multip(int n1[], int n2[], int a, int b, int m, int g[]){//funçao de multiplicaçao
- int i,j, k, h[100], c, aux=0, d, e, t[100];
- for(i=0;i<100;i++){
- t[i]=0;
- h[i]=0;
- }
- for(i=0;i<b;i++){
- for(k=0;k<a;k++){//IDEIA: armazenar em um vetor a multiplicaçao do ultimo algarismo de n2 por todos de n1, apos isso somar com o vetor g, fazer isso todas as vezes diminuindo em uma um a posiçao do ultimo algarismo do proximo vetor, e ir somando
- c=(n1[a-k]*n2[b-i])+aux;
- if(c>9){
- aux=c/10;
- c=c%10;
- }
- h[99-k]=c;
- }
- d=99-i;
- soma_mult(h, t, 99, d, d, g);
- for(j=0;j<100;j++)
- t[i]=g[i];
- for(k=0;k<100;k++)
- h[i]=0;
- aux=0;
- }
- }
- int main() {
- int n1[100], n2[100], i, a, b, n, d[100], g[100], m;//foram utilizados vetores de 100 casas decimais, para dessa forma poder ser efetuado o carry sem problemas, assim a multiplicaçao de dois numeros de 50 algarismos possa resultar em um de 100 algarismos
- for(i=49;i<100;i++){//vetor n1:utilizado para alocaçao dos numeros somente metade do vetor para assim garantir que possa haver o carry, fica alocada em uma variavel a maior posiçao onde ha algarismos
- scanf("%d", &n1[i]);
- if(n1[i]==-1){
- a=i-1;
- break;
- }
- }
- for(i=0;i<49;i++){//foram zeradas as 50 primeiras posiçoes para assim nao haver problemas com uma eventual ultrapassagem da quantidade de casas na multiplicaçao e soma
- n1[i]=0;
- n2[i]=0;
- }
- for(i=49;i<100;i++){//idem ao que foi feito ao vetor n1
- scanf("%d", &n2[i]);
- if(n2[i]==-1){
- b=i-1;
- break;
- }
- }
- for(i=49;i<=a;i++){//aqui é imprimido o vetor n1
- printf("%d", n1[i]);
- if(i==a)
- printf("\n");
- }
- for(i=49;i<=b;i++){//aqui é imprimido o vetor n2
- printf("%d", n2[i]);
- if(i==b)
- printf("\n");
- }
- soma(n1, n2, a, b,&n, d);//chamada a funçao soma
- if (d[48]!=0){//se na soma nao houve carry na soma dos ultimos algarismos dos vetores, ele imprimime somente a quantidade de casas igual do maior vetor
- for(i=48;i<=n;i++){
- printf("%d", d[i]);
- if (i==n)
- printf("\n");
- }
- }
- else {//se houve carry na ultima soma, entao imprime a quantidade de posiçoes mais 1, para assim imprimir o ultimo carry
- for(i=49;i<=n;i++){
- printf("%d", d[i]);
- if (i==n)
- printf("\n");
- }
- }
- for(i=0;i<100;i++)//sao zerados todas as posiçoes do vetor, para evitar que haja alguma operaçao indesejada, com algum algarismo tipo "lixo"
- g[i]=0;
- multip(n1, n2, a, b, m, g);
- for (i=0;i<=99;i++){
- printf("%d", g[99-i]);
- }
- return 0;
- }
Add Comment
Please, Sign In to add comment