// ================================================================================================ // Problem 13 // ================================================================================================ sint32 Problem13() { CBigInt sum; for(uintn i = 0; i < kNumbersSize; ++i) sum += CBigInt(kNumbers[i]); // -- iterate over the ten most significant digits uintn numdigits = sum.NumDigits(); Assert_(numdigits >= 10, "Not enough digits : " UintNFmt_, numdigits); flagn correct = true; for(uintn i = numdigits; i > 0; --i) { CLog::Write("%c", sint8(sum.Digit(i-1) + '0')); correct = correct && (kAnswer[numdigits - i] - '0' == sint8(sum.Digit(i-1))); } CLog::Write("\n"); Assert_(correct, "Sum should have been \n%s", kAnswer); return 0; }
void Crater::Generate(sint8 *outmap, sint32 outwidth, sint32 outheight, IC3Rand *randgen, const double *settings, sint32 numSettings) #endif { sint32 numCraters, maxRadius; if(numSettings >= 1) { numCraters = sint32(settings[0]); } else { numCraters = 50; } if(numSettings >= 2) { maxRadius = sint32(settings[1]); } else { maxRadius = 5; } sint32 maxRadiusSq = maxRadius * maxRadius; for(sint32 i = 0; i < numCraters; i++) { sint32 radius = randgen->Next(maxRadius) + 1; sint32 cx = randgen->Next(outwidth); sint32 cy = randgen->Next(outheight); sint32 x, y; sint32 ax, ay; sint32 rx, ry; sint32 rsq = radius * radius; for(x = cx - radius, rx = -radius; x <= cx + radius; x++, rx++) { ax = x; if(x < 0) ax += outwidth; if(x >= outwidth) ax -= outwidth; for(y = cy - radius, ry = -radius ; y <= cy + radius; y++, ry++) { ay = y; if(y < 0) ay += outheight; if(y >= outheight) ay -= outheight; sint32 const dist_square = (rx * rx) + (ry * ry); if (dist_square <= rsq) { sint32 const origh = sint32(outmap[ay * outwidth + ax]); sint32 newh = origh - dist_square - maxRadiusSq; if (newh < -127) { newh = -127; } outmap[ay * outwidth + ax] = sint8(newh); } } } } #if !defined(USE_COM_REPLACEMENT) return S_OK; #endif }