Skocz do zawartości

obliczenia na strigach


dragranis

Rekomendowane odpowiedzi

Witam,ostatnio na sprawdzianie z programowania miałem takie zadanie na 6 ale nijak nie wiem jak to zrobić.

 

"Program wczytuje 2 duże liczby (do 200 cyfr) oraz oblicza ich sumę oraz różnicę (od większej odejmuje mniejszą).Z racji dużych liczb użyj klasy string".

 

No właśnie,jak się za to zabrać?rzutowanie czy też konwersje raczej tu nie pasują więc jak mógłbym to zrobić?są jakieś metody w klasie string do takich obliczeń?z góry dzięki za jakiekolwiek wskazówki

Odnośnik do komentarza
Udostępnij na innych stronach

Kiedyś napisałem klasę, która miała właśnie za zadanie liczyć długie liczby na stringach, lecz teraz nie mogę jej znaleźć na dysku.

 

Napisałem na szybko coś takiego:

#include <cstdio>
int main(){
	const int size = 4;
	char* a = "0999";
	char* b = "0999";
	char c[size + 1] = { 0 };
	bool r = false;
	for (int i = size - 1; i >= 0; --i){
		int l = ((a[i] + b[i] - 2 * 48));
		c[i] = (l % 10 + (r ? r = false, 1 : 0) + 48);
		if (l > 9)r = true;
	}
	puts(c);
} 

 

jest to kod jedynie na dodawanie i nie jestem pewien czy działa jak należy, ale zawsze to jakaś wskazówka.

Odnośnik do komentarza
Udostępnij na innych stronach

#include <cstdio>
#include <string.h>
 
void add(char* a, char* b, char* c){
    const int size = strlen(a);
    for (int i = size - 1; i >= 0; --i){
        int l = a[i] + b[i] - 96 + c[i];
        if(l > 9)
            c[i-1] = 1;
        c[i] = l % 10 + 48;
    }
    c[size] = 0;
}
 
bool abigb(char *a, char* {
    for(int i = 0; i < strlen(a); ++i){
        if(a[i] == b[i])
            continue;
        if(a[i] > b[i])
            return true;
        else
            return false;
        
    }
}
 
void dec(char* a, char* b, char* c){
 
    const int size = strlen(a);
    char *tempb = new char[255];
    memset(tempb, 0, 255);
    strcpy_s(tempb, 255, ;
    bool comp = abigb(a, ;
 
    for(int i = 0; i < strlen(tempb); ++i){
        tempb[i] = '9' - b[i] + '0';
    }
 
    for (int i = size - 1; i >= 0; --i){
        int l = a[i] + tempb[i] - 96 + c[i];
        if(l > 9)
            c[i-1] = 1;
        c[i] = l % 10 + 48;
    }
    if(!comp){
        for(int i = 0; i < strlen(c); ++i){
            c[i] = '9' - c[i] + '0';
        }
        c[0] = '-';
    }else{
        ++c[strlen(c)-1];
    }
    c[size] = 0;
}
 
int main(){
 
    char* a = "011111111456789";
    char* b = "022222227897892";
    char *c = new char[strlen(a)];
    memset(c, 0, strlen(a));
    dec(a, b, c);
    puts(c);
    add(a, b, c);
    puts(c);
    getchar();
    return 0;
} 
piękny kod to nie jest, ale działa ;D

 

@edit, juz działa ;D

 

@edit2, nie obsluguje liczb ujemnych(jako a i b ).

@edit3, dodawanie ssie na wiekszych liczbach.

 

@down, pisane na szybko i "byleby było", jakbym to pisał dla siebie/na zlecenie, to by było zoptymalizowane i sprawdzalo długość obu liczb. Teraz wystarczy a = "123456"; b = "1234"; i się wysypie :D

Nie pomagam na PW, od tego macie forum!!!

 

#PHP-things

 

 

08FMpDu.png

 

Odnośnik do komentarza
Udostępnij na innych stronach

Odnośnik do komentarza
Udostępnij na innych stronach

Taka tam prowizorka ;]

Mysle ,ze powinno dzialac ...

 





#include <iostream>  

	using namespace std; 

main()
{
string a;		
string at;	
string b;
string bt;
		
 	int A[201];
	int B[201];
		A[0]=0;
		B[0]=0;
	int W[201];
	
int i=0,dla=0,dlb=0,dl=0;

cout<<"Podaj a: ";
	cin>>at;
cout<<"Podaj b: ";
	cin>>bt;

if(at.length()<bt.length())
	{
		a=bt;
		b=at;
	}
else
	{
	if(at.length()>bt.length())
		{
		a=at;
		b=bt;
		}
	else
		{
		for(i=0;i<at.length();i++)
			{
			if(at[i]>bt[i])
				{
				a=at;
				b=bt;
				break;
				}	
			if(at[i]<bt[i])
				{
				a=bt;
				b=at;
				break;
				}
			if(i==at.length()-1)
				{
				a=at;
				b=bt;
				break;	
				}
			
			}
		}
	}

int r=0;

do
{
	dla=a.length();
	dlb=b.length();

	dl=dla-dlb;
	
if(dl!=0)
  	{
	if(dl>0)
    	{
		for(i=1;i<dla+1;i++)
			{	
			if(i<=dl)
				{
				B[i]=0;
				}
			B[i+dl]=b[i-1]-48;
			A[i]=a[i-1]-48;
			}
		dl=dla;
		}
	if(dl<0)
   		{
		dl=dl*(-1);
		for(i=1;i<dlb+1;i++)
			{
			if(i<=dl)
				{
				A[i]=0;
				}
				A[i+dl]=a[i-1]-48;
				B[i]=b[i-1]-48;
			}
		dl=dlb;
		}
	}
else
	{
	for(i=1;i<dla+1;i++)
		{
		B[i]=b[i-1]-48;	
		A[i]=a[i-1]-48;	
		}
	dl=dla;
	}
	
if(r==0)
	{
	for(i=dl;i>=0;i--)
		{
		if(A[i]+B[i]>=10)
			{
			A[i-1]=A[i-1]+1;
			A[i]=A[i]-10;
			}
		W[i]=A[i]+B[i];
		}
	cout<<"\nWynik dodawania   : ";	for(i=0;i<dl+1;i++)cout<<W[i]<<"" ;
	}
	
if(r==1)
	{
	for(i=dl;i>=0;i--)
		{
		if(A[i]<B[i])
			{
			A[i-1]=A[i-1]-1;
			A[i]=A[i]+10;
			}
		W[i]=A[i]-B[i];
		}
	cout<<"\nWynik odejmowania : ";	for(i=0;i<dl+1;i++)cout<<W[i]<<"" ;
	}
	
r++;

}while(r<2);
	
	
	return 0;	
}


Odnośnik do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

  • Ostatnio przeglądający forum obliczenia na strigach   0 użytkowników
    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...