- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
if(x>=900&&x<1000)
{
std::cout<<"DCCCC";
if(x==901)
std::cout<<"I";
else if(x==902)
std::cout<<"II";
else if(x==903)
std::cout<<"III";
else if(x==904)
std::cout<<"IV";
else if(x==905)
std::cout<<"V";
else if(x==906)
std::cout<<"VI";
else if(x==907)
std::cout<<"VII";
else if(x==908)
std::cout<<"VIII";
else if(x==909)
std::cout<<"IX";
if(x==910)
{
std::cout<<"X";
if(x==911)
std::cout<<"I";
else if(x==912)
std::cout<<"II";
else if(x==913)
std::cout<<"III";
else if(x==914)
std::cout<<"IV";
else if(x==915)
std::cout<<"V";
else if(x==916)
std::cout<<"VI";
else if(x==917)
std::cout<<"VII";
else if(x==918)
std::cout<<"VIII";
else if(x==919)
std::cout<<"IX";
}
else if(x==920)
{
std::cout<<"XX";
if(x==921)
std::cout<<"I";
else if(x==922)
std::cout<<"II";
else if(x==923)
std::cout<<"III";
else if(x==924)
std::cout<<"IV";
else if(x==925)
std::cout<<"V";
else if(x==926)
std::cout<<"VI";
else if(x==927)
std::cout<<"VII";
else if(x==928)
std::cout<<"VIII";
else if(x==929)
std::cout<<"IX";
}
//
GLeBaTi 02.08.2010 09:36 # +2
там есть исходник, только на JS
Stalker 02.08.2010 09:49 # +1
3.14159265 02.08.2010 09:56 # −1
TarasB 02.08.2010 22:47 # +1
Stalker 03.08.2010 13:32 # +1
3.14159265 03.08.2010 15:11 # 0
когда i допустим = 4
>>>Не могу придумать, на чём
на любом языке с Си-подбным синтаксисом
ЗЫ а это системная ф-ция делфей DivMod ?
Stalker 03.08.2010 15:38 # +1
DivMod() да, стандартная (модуль Math, вот исходник, если что):
3.14159265 03.08.2010 16:32 # +1
удобно придумано, до этого я думал, что только в асме так можно, реально очень удобно, я мечатал о появлении такой простой фичи...
>>>i не бывает больше 3
тупанул, кстати т.к. на Западе они годы иногда римскими цифрами пишут - их ожидает проблема 4000 )))
Stalker 04.08.2010 11:48 # 0
3.14159265 03.08.2010 17:29 # 0
1. выполняются 2 деления - даже если нам нужно одно - нужно перенести деления в условия а в самом условии написать if (dm == 4)
2. убрать умножение i*3 и сдвиг i*2
короче вот мой вариант
извиняюсь за грубый ассемблерный хак в яве -0x30, просто деление я не люблю
3.14159265 03.08.2010 17:44 # 0
а от умножений можно отказатся приведенным выше способом
3.14159265 03.08.2010 17:46 # 0
3.14159265 03.08.2010 17:51 # 0
3.14159265 03.08.2010 17:56 # 0
полный набор и 0x30; в яве
и одно-двух буквенные неймы
3.14159265 03.08.2010 18:10 # 0
3.14159265 04.08.2010 09:25 # +3
тут вообще можно избавится от делений т.к. d<10
то деление на 5 эквивалентно ((d+3)>>3), ((d-1)>>2) не катит т.к. 9
а остаток можно заменить на условие (d!=4 && d!=9), и взятие второго остатка можно тоже сделать через логику ну или на краняк вот так:
d % 5 =(d>4) ? d-5 : d
3.14159265 04.08.2010 10:00 # +2
d % 5 = (d-((d+3)>>3)) & 3;
в итоге получится весьма короткий код на сложениях, вычитаниях и сдвигах, и без условий.
что можно кончно еще оптимизировать. ))
Stalker 04.08.2010 11:46 # 0
А тут можно ещё res сделать на StringBuilder'е. И вот это: new String(new char[] ... как-нибудь попробовать вынести (Но я тут хз, не силён в яве).
3.14159265 04.08.2010 12:31 # 0
кстати отнимание (char)'0' все-равно по меркам явы хак, равно как -0x30;
>>А тут можно ещё res сделать на StringBuilder'е.
я хотел было, но там же не в конец добавлять надо а в начало - то есть insert, а он копирует целый массив, что слоу
3.14159265 04.08.2010 12:31 # 0
1. это легко портировать в любой С-like язык, да и любой другой тож
2. в С/С++ можно намутить быструю сборку строки через указатели
3.14159265 04.08.2010 18:24 # 0
вообще можно собирать задом-наперед а потом сделать реверс, но сдается мне, что реверс будет выполнятся дольше чем весь мой алгоритм
TarasB 02.08.2010 22:46 # +3
Говнокод же.
rudolff 05.08.2010 13:13 # 0
Stalker 02.08.2010 09:39 # +1
А вообще, Гугль в помощь. Гениально.
ForEveR 02.08.2010 09:54 # 0
GLeBaTi 02.08.2010 12:01 # 0
malleus 02.08.2010 12:46 # 0
nil 16.08.2010 18:57 # 0
И мозг.
xaionaro 02.08.2010 23:16 # +3
ForEveR 03.08.2010 22:53 # 0
#include <string>
#include <vector>
int main()
{
int number=0;
std::string Str1="I"; std::string Str3="V"; std::string Str5="X";
std::string Str7="L"; std::string Str9="C"; std::string Str11="D";
std::string Str13="M"; std::string Str2="IV"; std::string Str4="IX";
std::string Str6="XL"; std::string Str8="XC"; std::string Str10="CD";
std::string Str12="CM";
int Array[]={1, 4, 5, 9, 10, 40, 50, 90, 100, 400, 500, 900, 1000};
std::vector<std::string> Arrayyy;
Arrayyy.push_back(Str1); Arrayyy.push_back(Str2); Arrayyy.push_back(Str3);
Arrayyy.push_back(Str4); Arrayyy.push_back(Str5); Arrayyy.push_back(Str6);
Arrayyy.push_back(Str7); Arrayyy.push_back(Str8); Arrayyy.push_back(Str9);
Arrayyy.push_back(Str10); Arrayyy.push_back(Str11); Arrayyy.push_back(Str12);
Arrayyy.push_back(Str13);
std::string res="";
std::vector<int> Arr;
for(int i=0;i<13;++i)
{
Arr.push_back(Array[i]);
}
std::cout<<"Enter number in arab: ";
std::cin>>number;
if(!number) res=" ";
size_t i=Arr.size()-1;
while(number>0)
{
if(number>=Arr[i])
{
res+=Arrayyy[i];
number-=Arr[i];
}
else
{
i--;
}
}
std::cout<<res<<'\n';
return 0;
}
Длинный немного. Но полностью корректный.
Мистер Хэнки 04.08.2010 05:24 # −1
>>std::string Str7="L"; std::string Str9="C"; std::string Str11="D";
>>std::string Str13="M"; std::string Str2="IV"; std::string Str4="IX";
>>std::string Str6="XL"; std::string Str8="XC"; std::string Str10="CD";
>>std::string Str12="CM";
use Enum, Luke!
absolut 04.08.2010 07:51 # 0
ForEveR 04.08.2010 14:22 # 0
absolut 04.08.2010 14:47 # +1
char* arrch[] = { "I", "IV", "V", "IX", "X", "XL", "L", "XC", "C", "CD", "D", "CM", "M" };
ForEveR 04.08.2010 14:54 # 0
Хотя по размеру кода конечно есть.
Мистер Хэнки 04.08.2010 05:25 # +11
3.14159265 04.08.2010 08:56 # 0
Desconocido 03.09.2010 17:44 # 0