skrócenie kodu, zmiana części na rekurencję | Dzielenie wielomianu przez dwumian

0

Jeśli stopień wielomianu wejściowego oznaczymy jako n, to na wejściu otrzymasz jeden wiersz tekstu zawierający rozdzielone spacjami n+2 liczby rzeczywiste; n+1 pierwszych liczba to współczynniki dzielnej, ostatnia to wyraz wolny dzielnika; 4 ≤ n ≤ 102

Wyjście to jeden wiersz, zawierający jedną liczbę rzeczywistą równą reszcie z dzielenia wielomianu przez dwumian

Po usunięciu wszystkich tabulacji oraz enterów jego waga to nadal 322B. Chciałbym go skrócić jeszcze bardziej, a mianowicie poniżej 300B.

Wydaje mi się że mógłbym to osiągnąć gdybym użył rekuręcji ale niestety nigdy czegoś takiego nie robiłem.

Mógłby mi ktoś zmodyfikować ten kod tak aby ważył poniżej 300B albo chociaż podpowiedział jak bym mógł taki efekt osiągnąć?

#include <iostream>
#include <string>
#include <cstdlib>
int main(){
    std::string a,b,d;
    getline(std::cin,a);
    int i,c,e,z,f,y;
    for(i=0;i<a.size();i++)if(a[i]==32)c=i;
    c++;
    d.insert(0,a,c,a.size()-1);
    e=atoi(d.c_str());
    -e;
    for(i=0;i<c;i++)
    if(a[i]!=32)b+=a[i];
        else{
            f=atoi(b.c_str());
            (y!=1) ? z=f : z=z*e+f;
            b="";
            y=1;
        }
    std::cout<<z;
}
1

Zastanawiam się tylko czemu operujesz Stringami. Spacja w konsoli działa jak enter. Biały znak - koniec wczytywania do zmiennej (przy wczytywaniu cin>>). Jak pousuwasz te konwersje typów, to może się zmieścisz :) Jeśli nie, to poszukaj implementacji schematu hornera (rekurencyjnie).

PS. Co według ciebie robi ta linia?

-e;
0

-e; zmienia wartość e na przeciwną;

0

jak nie stringami to czym? żebym mógł wczytać cały ciąg używam getline(). A jeżeli usunę konwersję to nie będę mógł nad poszczególnymi kawałkami kodu pracować jak na liczbach. I już naprawdę nie wiem co zrobić :(

1
Wybitny Szczur napisał(a):

-e; zmienia wartość e na przeciwną;

Nie zmienia

0

ok. Czyli musi być tak:

#include <iostream>
#include <string>
#include <cstdlib>
int main(){
	std::string a,b,d;
	getline(std::cin,a);
	int i,c,e,z,f,y;
	for(i=0;i<a.size();i++)if(a[i]==32)c=i;
	c++;
	d.insert(0,a,c,a.size()-1);
	e=atoi(d.c_str());
	e=-e;
	for(i=0;i<c;i++)
	if(a[i]!=32)b+=a[i];
		else{
			f=atoi(b.c_str());
			(y!=1) ? z=f : z=z*e+f;
			b="";
			y=1;
		}
	std::cout<<z;
}
0

a wracając do sedna. Nie do końca rozumiem jak bym miał usunąć konwersje żeby mi to jednak działało...

1

@Lectre już napisał, wczytaj sobie wszystko w pętli za pomocą cin>> (zrób sobie licznik żebyś wiedział ile liczb wczytałeś
wiesz, że n nie będzie większe niż 102, zadeklaruj taką tablicę

0

no ale to musi być wczytane jednorazowo a nie każda liczba oddzielnie.

1

na wejściu otrzymasz jeden wiersz tekstu zawierający rozdzielone spacjami

Jeszcze raz: Spacje działają jak entery. Nie potrzebujesz getline. Nie ma różnicy czy w konsoli wpiszesz

 1
2
293

czy

1 2 293

to wszystko jest równoznaczne. Zaufaj nam, to działa.

1

wczytuj liczby tak:

double tab[105];
int n=0;
while(cin >> tab[n]) n++;
0

No dobra... Troszeczkę poczytałem o strumieniowaniu cin i zaczynam kumać :) Jeden problem rozwiązany ale pojawił się następny... mianowicie:
Wszystko ładnie wczytuje ale przecież po tym jak wczyta wszystkie liczby to znów muszę coś wpisać aby ruszył dalej... Nie dało by się tego jakoś zrobić tak żeby nie żądał niczego drugi raz?

0

Co jakiś problem rozwiąże to się pojawia następny...
Spróbowałem wczytać troszeczkę inaczej ale wtedy mi nie wczyta pierwszej liczby bo w warunku się wczytuje...

 	while(cin.get!='\n') {
		cin>>t[n];
		n++;
    }

Jakieś pomysły?

0

Dobra. Nareszcie :) Zobaczymy jaki mi wyjdzie efekt końcowy :) Ale to dopiero jak się wyśpię :)
No i oczywiście pochwale się dla potomnych z forum którzy by na przyszłość potrzebowali podobnej pomocy do jakiego rozwiązania doszliśmy :)

	double t[105];
	int n=0;
	cin>>t[n];
	n++;
	while(cin.get()!='\n') {
		cin>>t[n];
		n++;
    }
	fo
0

Nie mogłem usnąć :)
Mam coś takiego:

#include<iostream>
#include<vector>
#include<cmath>
int main()
{
	double t[105],e,z;
	int n=1;
	int i,y;
	std::cin>>t[n-1];
	while(std::cin.get()!='\n') {
		std::cin>>t[n];
		n++;
    }
    n--;
    e=-t[n];
    for(i=0;i<n;i++){
    	(y!=1) ? z=t[i] : z=z*e+t[i];
    	y=1;
    }
	printf("%.3lf", z);
}

Kod jest wystarczająco krotki ale nie do końca działa. Znaczy się działa ale tylko u mnie na komputerze. Gdy próbuję go uruchomić w http://ideone.com to zawsze wywala że przekracza limit czasu. Najgorsze jest to że nie wiem czemu...

0

Tu masz dowód na to, że to wczytywanie prowadzi do błędów (ze 123 zrobiło się 23!
Raczej chcesz zrobić coś takiego:

#include <sstream>
...
string lineStr;
while (getline(cin, lineStr) {
    stringstream line(lineStr);
    double tab[200];
    int n=0;
    while(line>>tab[n]) ++n;
}
0

Ok. Mam teraz taki kod:

#include<iostream>
int main(){
double t[104],z;
int n=0,i=0;
while(std::cin>>t[n++]&&getchar()==32);
for(n--,z=*t;++i<n;) z=z*-t[n]+t[i];
printf("%.3lf", z);
}

Wszystko czysto hipotetycznie działa. Baa. Działa i praktycznie tylko wydaje mi się że o czymś zapomniałem. Tylko nie wiem o czym. Czy aby na pewno Każde dane które podam dadzą odpowiedni wynik??? Nie wiem... Może wy coś zobaczycie czego ja nie widzę...

0

A jeżeli chciał bym wyświetlić 3 miejsca po przecinku tylko że nie w przybliżeniu to jak bym miał to zrobić?

0
DecimalFormat df = new DecimalFormat("#.###"); 

chyba, że zawsze dokładnie 3 miejsca

DecimalFormat df = new DecimalFormat("#.000"); 

wyświetlasz: (d to jakiś double)

df.format(d)

1 użytkowników online, w tym zalogowanych: 0, gości: 1