Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

obliczenia na strigach


dragranis

Rekomendowane odpowiedzi

Opublikowano

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

Weteran
Opublikowano

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.

Opublikowano

#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

 

Opublikowano
Opublikowano

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;	
}


Zarchiwizowany

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

×
×
  • Dodaj nową pozycję...