Zadanie
Wejście
Na standardowym wejściu program otrzymuje w pierwszej linii liczbę n dzieleń, które trzeba wykonać. W kolejnym wierszu znajduje się liczba d cyfr po przecinku, które mają być policzone. W kolejnych wierszach znajdują się oddzielone spacją pary liczb całkowitych p i q — dzielnych i dzielników.
1<=n<=1000
0<=d<=100000
0<=p<=100000000
1<=q<=100000000
Wyjście
Program ma wypisać na standardowym wyjściu w n wierszach odpowiednio zaokrąglone wyniki kolejnych dzieleń. Część całkowita wyniku oddzielona jest od reszty przecinkiem. Jeżeli d jest równe zero, to przecinek nie jest w ogóle wypisywany.
Przykład
Wejście
3
3
1 3
247 2000
259998 20000
Wyjście
0,333
0,124
13,000
Wymagania
Ilość używanej przez program pamięci nie powinna zależeć od danych wejściowych (złożoność pamięciowa stała). Program powinien działać w czasie proporcjonalnym do zadanej liczby miejsc po przecinku (złożoność czasowa liniowa).
moj program
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*======================================
FUNKCJA DZIELI NA ZASADZIE DZIELENIA
PISEMNEGO
======================================*/
char* dzielenie (int p, int q, int liczbaMiejscPoprzecinku)
{
char cCzescUlamkowa[10003]; // 10000 miejsc po przecinku + ',' + znak konca tablicy + jedno na ew zaokraglenie
char cCzescCalkowita[10];
char cWynik[10012]; //czesc ulamkowa + max 9 z calkowitej
int liczba1= (int)(p/q);
int liczba2;
int pomoc;
itoa(liczba1, cCzescCalkowita,10);
if (liczbaMiejscPoprzecinku>0)
{
cCzescUlamkowa[0]=',';
liczba2=liczba1*q;
liczba1=p;
for(int i=1;i<=liczbaMiejscPoprzecinku+1;i++) //+1 bo przecinek a chcemy jedna wiecej zeby zaokraglac
{
pomoc=liczba1-liczba2;
liczba1=pomoc*10;
pomoc=(int)(liczba1/q);
liczba2=pomoc*q;
cCzescUlamkowa[i]=pomoc+48; //ASCII
}
/*======================================
ZAOKRAGLANIE
======================================*/
if(cCzescUlamkowa[liczbaMiejscPoprzecinku+1]>='5') //ostatnia cyfra
{
int k=0;
int przeniesienie=1;
if(cCzescUlamkowa[liczbaMiejscPoprzecinku-k]=='9') // przedprzedostatnia cyfra
{
while((cCzescUlamkowa[liczbaMiejscPoprzecinku-k]=='9')&&(k<=liczbaMiejscPoprzecinku)&&(przeniesienie==1))
{
cCzescUlamkowa[liczbaMiejscPoprzecinku-k]='0';
k++;
przeniesienie=1;
if((cCzescUlamkowa[liczbaMiejscPoprzecinku-k]<'9')&&(cCzescUlamkowa[liczbaMiejscPoprzecinku-k]!=','))
{
przeniesienie=0;
cCzescUlamkowa[liczbaMiejscPoprzecinku-k]+=1;
}
if((cCzescUlamkowa[liczbaMiejscPoprzecinku-k]==',')&&(przeniesienie==1))
{
/* ZAMIANA LICZBY CALKOWITEJ NA INTA
ZWIEKSZENIE WARTOSCI O 1
PONOWNA ZAMIANA NA STRINGA */
przeniesienie=0;
int calkowita=atoi(cCzescCalkowita); // string to int
calkowita++;
itoa(calkowita,cCzescCalkowita,10); //int to string
}
}
}
else cCzescUlamkowa[liczbaMiejscPoprzecinku]+=1; //przedostatnia cyfra
}
cCzescUlamkowa[liczbaMiejscPoprzecinku+1]='\0';
strcat(cWynik,cCzescCalkowita);
strcat(cWynik,cCzescUlamkowa);
}
return cWynik;
}
int main()
{
int liczbaDzialan,liczbaMiejscPoprzecinku;
int p,q; // DZIELNA I DZIELNIK
scanf("%d",&liczbaDzialan);
scanf("%d",&liczbaMiejscPoprzecinku);
char *tabWynikow[1000];
for(int i=0;i<liczbaDzialan;i++)
{
scanf("%d %d", &p, &q);
tabWynikow[i] = dzielenie(p,q,liczbaMiejscPoprzecinku);
}
for(int j=0;j<liczbaDzialan;j++)
{
printf("%s\n",tabWynikow[j]);
}
return 0;
}
ostrzezenie:
z2c.cpp: In function char* dzielenie(int, int, int)': z2c.cpp:18: warning: address of local variable
cWynik' returned
moje wyjscie:
0,3330,12413,000
0,3330,12413,000
0,3330,12413,000
nie bardzo rozumiem gdzie lezy problem i jak go naprawic. na upartego moglbym rozdzielac te wyniki po przecinkach i liczby miejsc po przecinku ale nie o to chodzi... prosze o pomoc i z gory dziekuje.
edit:
zamiast cCzescUlamkowa[liczbaMiejscPoprzecinku+1]='\0'; mozna dac cCzescUlamkowa[liczbaMiejscPoprzecinku+1]='\n' ; i tylko raz wyswietlic tablice ale tez nie o to chodzi;p