Mam 2 liczby int, a = 3, b = 14. Chciałbym z nich zrobić jedną liczbę double = 3.14 - Jak to zrobić najprościej?
double.Parse( a + "." + b );
:P
Aha, ale chciałeś c++ :P
no w javie to banał ; D ale w C? chciałem najpierw na char* zamienić, potem na double, ale coś mi podpowiada, że da się prościej :P
Pisane z palca, ale będzie coś w rodzaju:
double = a+b/(10^(1+trunc(log10(b))))
Gdzie ^
oznacza do potęgi
, a a
oraz b
są ofc.liczbami naturalnymi.
Na razie mam tak:
#include <stdio.h>
#include <stdlib.h>
int main()
{
unsigned long a = 3, b = 4;
const int n = snprintf(NULL, 0, "%lu", b);
const int m = snprintf(NULL, 0, "%lu", a);
if(n < 0 || m < 0)
{
printf("error\n");
}
char *buf = (char*)malloc(sizeof(char) *(n+m+2));
if(buf == NULL)
{
printf("error\n");
}
int c = snprintf(buf, n+m+2, "%lu", b);
if(c <0)
{
printf("error\n");
}
c = snprintf(buf+n, n+m+2, "%c", '.');
if(c<0)
{
printf("error\n");
}
c = snprintf(buf+n+1, n+m+2, "%lu", a);
if(c<0)
{
printf("error\n");
}
buf[n+m+2] = '\0';
double x = atof(buf);
printf("%f\n", x);
return 0;
}
A nie prościej będzie zapisać b do tego double-a, potem dzielić przez dziesięć (np w while-u) dopóki nie stanie się mniejsza od jedynki (w tym przypadku 2x coby uzyskać 0.14), i dodać a?
coś na kształt
#include <stdio.h>
int main()
{
int a=3,b=14;
double wynik=b;
while (wynik >=1 ) wynik /=10;
wynik += a;
printf("%f",wynik);
return 0;
}
@sig chyba chodzi o coś takiego
#include <stdio.h>
int main()
{
int a=3,b=14;
double wynik=b;
while (wynik >=1 ) wynik /=100;
if(wynik < 0.1) wynik *= 10;
wynik += a;
printf("%f",wynik);
return 0;
}
wolniejsze będzie tylko jeśli b jest jednocyfrowe. Dla innych przykładów będzie równie szybkie lub szybsze.
Takie o, wzorujące się na pierwszym przykładzie ;)
#include <iostream>
#include <cstdlib>
#include <cstdio>
using namespace std;
double IntsToDouble(int a, int b)
{
char buf[64];
sprintf(buf,"%d.%d",a,b);
return atof(buf);
}
int main()
{
int a=3,b=14;
double c=IntsToDouble(a,b);
cout << c;
return 0;
}
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
int a=3,b=14;
cout<<(a+pow(10,fmod(log10(b),1)-1))<<endl;
return 0;
}
Po pierwsze, musisz się zastanowić jak dokładnie to ma działać.
Czy a=3
i b=1
to ma być 3.1
czy 3.01
? Jeśli opcja pierwsza, to w jaki sposób chcesz uzyskać 3.01
(o ile w ogóle)? Jeśli druga, to sugeruje to stały dzielnik, po czym sytuacja staje się trywialna.
Przy wyborze opcji pierwszej, jeśli b
może być nie większe niż ok. 1015 (na standardowych doublach x86), to możesz sobie obliczać je prostą funkcją
double f(long long v){
return v*pow(10,-(floor(log10(v))+1));
}