2 ning 22222 chi darajasini C/C++ da hisoblaymiz.

Salom. Bundan ancha yillar oldin shu savolni kimdandir eshitgandim. Bunda daraja 20000 ming edi. Man hammo yoqda 2 bo'lsin deb 22222 deb yozdim. Umuman hamma ikkita sonni ko'paytirishni biladi. Man ham shu usuldan foydalandim.

Umuman katta sonlarni ko'paytirishni:
ru.wikipedia.org/wiki/Алгоритм_Фюрера
ru.wikipedia.org/wiki/Метод_умножения_Шёнхаге_—_Штрассена
dan olsangiz bo'ladi.

Keling oldin 2048 ni 2 ga ko'paytirishni ko'rsatsam. Shunda pastda keltirilgan dastur mohiyatini tushunib olasiz.
Bu holatda manda
result[0] = 8;
result[1] = 4;
result[2] = 0;
result[3] = 2;

va length = 4 bo'ladi. Ko'paytirish quyidagicha amalga oshiriladi:
8 * 2 + 0 = 16 bundan r = 1, result[0] = 6
4 * 2 + 1 = 9 bundan r = 0, result[1] = 9
0 * 0 + 0 = 0 bundan r = 0, result[2] = 0
2 * 2 + 0 = 4 bundan r = 0, result[3] = 4

Natijani teskariga o'qisangiz 4096. Agar oxirgi qadamda r > 0 bo'lib qolsa, result[length] = r qiladi va length bittaga oshiradi. Misol uchun 8 * 2 ga ko'paytirganda length = 1 va result[0] = 8 bo'ladi. Ko'paytirgandan keyin r = 1 bo'lib qoladi va result[0] = 6 bo'ladi. Shunda lengthni bittaga oshirib, result[1] = 1 qilib qo'yadi. Shunda teskariga o'qilsa 16 bo'ladi.

Manimcha tushuntira oldim, endi keling kodni ko'rsak
#include <stdio.h>
#include <math.h>

unsigned char result[10000];
int length = 1;

void pow(unsigned char k)
{
	unsigned char r = 0;

	for(int i = 0; i < length; i++)
	{
		result[i] = result[i] * k + r;
		r = (int)floor(result[i] / 10.0);
		result[i] = result[i] % 10;
	}

	if (r > 0)
	{
		result[length] = r;
		length++;
	}
}

int main()
{
	int i = 0;
	result[0] = 1;

	for(i = 0; i < 22222; i++)
	{
		pow(2);
	}

	for(i = length - 1; i >= 0; i--)
	{
		printf("%d", result[i]);
	}

	return 0;
}


Natija:
308009168972336182414410419331859166923599006200562888373474151264812784041154301603695397525054310097081958523119566704192336269395093838150305384979548814686850473235311227494963772520581206217090061857675307167648476567125788327291078538144783700295912118773146778680439641469314352017261941191508309926544897673761188937190026267763550587011044154043285323829388961378083251053116165089083868735293206469967368951783048361342535590323864722849367869574992928277450567475008069627261307475148462394216182422695399464495077453133040105860913190627505393930425168466117136816045403430295252647109744943306410700414080597635766374462442002074132013871497185929174008357079653661428460001535052652648576047584734798440069994518505630637284792725968843007110647473092148765389462840428172884592934474278097592511148347059689124408372295963995834875293967442905023654773730749662050844005191732469690783067257076276171968914025218685944817100878451198454572921856816402158215532787510919073918547809456620971603014180333890411651682361546926810513841555199655329532409445004768934754995192994204355839274133739467179198952634307935169293235135649855980124736325691638995369996618093456981728229613530600662236965708364071258367572708867655113585283685567351810268703996827721234840898364702710601410616871399798342994538828864370623535621252171322765205152888615782208189066096670715004767995978672012557189567621924075635954488841611528236694471264701354365247052139288640275549035233549381820302300878898550204478903232172452505238056580497829510992958364678159297791855170386804264964329982820262997103072737652409705334896802029142752432132449740031231674945236334100942642633788803683423346283724323243339080431327814013864629164549789059879893736480609400940427517635796837212515816929740910177207988236747108061881585091187104688525540296543734032864134495046340283851368174633025863639189216596391273608236391341363056636044449600464843425971787629204840169806309486252747133181886737079483522479345410740523863101734069690100880482903466860662702263391026062588404517491421888500408356770348044680700383961644210277155849623691793150817967260658341640642823615256037052032605368469344206759512734807581531370042630483348281275262310055900461542148637096791757953990091819210403838702975943066404911209057777853142293698910324657764059390130190452458474936950716236595427233316351710667292272881018913150017029836189946134568681679086390734088321007418057683231573720239169325862405164148014869036912001370545706121599523292720169733442618696004370450508002949769440407516788123438444282740668319179587515451328775148569251295257186533933859586368241315072631764049414197849444456848702212650457662129865070308254383837830685891920532742107016721880942119218987861594082523697849901873227520852224625184154366231300465074450606634125068451911043112120870160139395428152478945547927127314565579623932296365676589488247291895419700841178937563195261321646651806674608078279430654668353438517916823536874492988035445096622555941975201898685016213832279331624250886202637128944510137806151622025322825800935764140485620029775581318614319036017286562020228619014350233982034426673067283197483171147876263950793199461598095109241091453084565956134710234725593073872262023434040318712376331467512224842403853903598752405325454962366542143293795561002114084717581144239749580865741728129030917804973965684825370804840630480074583802039679154223830427612723892461279257168723193626529790285476885674159733188797178990152318974379394687897280435223663309972680274493382650802695507228979132327767974208087420896130039848887123054559335146734717100658965679953810335877635634599318569015985659170953239430603014206664441726291155676059782394594307648317339857637772679473702651540263025279132785675316145426952384120945078419984964004514746840301835306807259917902090738756537170431135860178971913435244185553180666029356950915149222915263049126348907459958051762986292569760273014830926093903233664129161319506366019422767567913344761232962803534048674604697010512869558559057983525574497965257424154037389638756407037696753692382084725427205080216268950507216158809838469743460453786139649361643959146527519149996318472256345328070609205436530612684352087276085796532398835417905437375919338529672547964875071281692376854869628481009545250240972442327628811848469575333016371354163428990487284302026499731313209029193121649700075263817503509890675299014719478325779985063052582691579648314151953150724792884509837024479065572585053977950120485691472517275794590467777981063295855379390932846206184273822153825795915886887876520903829808223228717289039003331792513898420871335625930808198097988240799139008692970062840752348016452363487113136065445284644630928781762208076211097647147709515599338593435360797250485035329293347436365605992054579861303232020101620438289716394459722964426228691935740562028248629093695943687653727788091832703114809497277792859467453982626679606764469514763486154247744955254094368298193596567622561942593249335404081192052458787617535336274755555377349906195433909284686061202227315297634211303119686919102747654961046015936362983201760349810377888663138834650707163740429979834577283149811394383465055723719562721768257768843797400339674645418139532831278639230299688870458188921957504890377391595866659348060678616791236798705656610203152916236450573875953779458003657930711383405042951610201139034859332282357685083473105001841878856893587548017102756820187920007757972664800231962493912105558162241247166515786607248208676471385410242558846784918833063922220212689303081874208590772185882620614336431063340662671924938379345995742052658969662974368452573411015698703907370708601645944131634777527356052099412999524654085861224704034962241012812705544179533814867021705566291267872946948595344796686837462323289420962721133403096894876309550318492522765343427871930309027231836807875621075371791233555895582947068297027238557133000946766957869983113364103536076487954963615668150885719227633700130816647974529327104752648183002280855990141454666481256182725503308932267863966558495488501120787757921741889602515183630425919076433556089830656418048946529072190339004601319218580212958347444801774850088876912020682242217265352389457455860535936452679422429933768876304883367689013324816708910050201154064180324789232677643145046266058164934303864200301292217251936894436723116984815197018696780323525906280318301278898955196479720837618765896148736718969434239288932878642868029175627333035354377326397700723763059634370795346651600034966174021738290848198035679979187628337037727920715108818115894220302736311970805412864584751702589948332532638863259603042304


Ochig'i shu misolni bundan ancha yillar oldin ham yechgandim, unda fayllarga sonlarni yozib yana nimalardir qilib juda ko'p kod yozgandim. Odam yillar o'tkan sari kodlarni qisqa yozishni o'rganarkan.

Bu yozganim sodda usullari, agar internetdan qidirsangiz bundanda tez ishlaydigan variantlarini qidirib topsangiz bo'ladi.

Shu misolni PHP da quyidagicha yozsa bo'ladi
echo bcpow("2", "22222");

natijani solishtirishga kerak bo'ladi :)

Savollar bo'lsa marhamat.

Qo'shimcha. Eski yozgan kodimni ham topib oldim. Lekin umuman o'zim ham tushunmadim. Kod 2009 yil 1-aprel kuni yozilgan ekan.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>

char *kup (char *);

int main()
{
	char *buf;		buf		= (char *)malloc(0);	memset(buf, 0, 1);
	char *tlen;		tlen	= (char *)malloc(0);	memset(tlen, 0, 1);
	char *natija;	natija	= (char *)malloc(0);	memset(natija, 0, 1);
	char *c;		c		= (char *)malloc(0);	memset(c, 0, 1);
	char *txt; txt = (char*)malloc(0);
	
	int j = 0, daraja;
	do {
		system("cls");
		printf("[0..80000] oraliqdagi son kiriting: 2 ^ ");
		scanf("%d", &daraja);
		
	}while (!(daraja >= 0 && daraja <= 80000));

	strcpy (txt, "1");
    
    for (j = 0; j < daraja; j++)  {
        txt = kup(txt);
		printf("\rXisoblandi: %0.2f %%\tNatija xajmi: %0.3f kB", (j+1)/(float)daraja*100, strlen(txt)/1024.0);
    }
	
	int len = strlen(txt);
	
	itoa(len, buf, 10);
	strcat(tlen, "Raqamlar soni: ");
	strcat(tlen, buf);
	strcat(tlen, "\n\nNatija:");
	
	printf("\n\n\n%s", tlen);
	printf(" \"natija.txt\" faylda\n\n");
	
	FILE *file;
	file = fopen("natija.txt", "w");
	fwrite(tlen, strlen(tlen), 1, file);
	fputc(13, file);
	
	for (j = len-1; j >= 0; j--) {
		fputc((int)txt[j], file);
	}
	
	fclose(file);

	return 0;
}

char *kup (char *t) {
    int len = strlen(t), i = 0, n = 0, k = 0;
    char c, buf[100];
    for (i = 0; i < len; i++) {
        c = t[i];
        n = (c - '0') * 2 + k;
        k = 0;
        if (n >= 10) {
            n -= 10;
            k = 1;
            if (i == len - 1) {
                strcat(t, "1");
                k = 0;
            }
        }
        itoa(n, buf, 10);
        t[i] = buf[0];
    }
    return t;
}

1 комментарий