//Това е отговор на
// it-place.net > Форум > Задачи > Квадрат и куб на цяло число
//Реализира се алгоритъм за повдигане на "голямо" число на втора степен.
//Оригиналният алгоритъм избягва междинните резултати при това е за
//умножение на две произволни числа(този също). Тук имаме един
//междинен резултат.
//Не се прави проверка за коректност на входа и т.н.
//Коментариите липсват или са минимални, защото:
//1. Това не е точно алгоритъма, който искам да реализирам
//2. Може би ще Ви е интересно да го разгадаете:-)
//Акцентът е върху алгоритъма. Така, че трябва да се внимава какво се
//въвежда:-)
//Компилирана е с g++, с малки изменения върви и на Microsoft C++
//Например, можем да пресметнем:
//z=234234235454352543243242354354363452532423523523523
//z*z=05486567705888506598020681713518889802337323201766038140835736560
//2349397513356435363995449337134331529
//Както се вижда не е реализирано и игнориране на началната 0-ла:-)
//И все пак и тук не могат да се смятат произволно големи число.
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main(int argc, char *argv[])
{
//тук съхраняваме числото, което ще повдигаме на квадрат
vector<char> a;
string aa;
cout<<"Input number z=";
cin>>aa;
//дължина на числото
const int n=aa.size();
const int two_n=2*n;
//Тук ще се помества резултатът
vector<int> rez(two_n,0);
for(int i=0;i<n;i++)
{
a.push_back(aa[i]-48);
}
//начало на алгоритъма
int k=two_n-1;
int kk=two_n-1;
for(int i=n-1;i>=0;i--)
{
for(int j=n-1;j>=0;j--)
{
rez[k]=rez[k]+a[j]*a[i];
k--;
}
kk--;
k=kk;
}
int med;
//формиране на резултата
for(int i=two_n-1;i>0;i--)
{
med=rez[i];
rez[i]=rez[i]%10;
med=(med-rez[i])/10;
rez[i-1]+=med;
}
//край на алгоритъма
1 посетител чете този скрипт (0 потребители и 1 гост)
Активни потребители:
---
Здравей, Jan!
Радвам се, че вече няколко пъти се получават интересни дискусии над твои програмки - продължавай в същия дух! :) Защото именно такива дискусии са от полза на всички ни по пътя да станем по-добри програмисти :)
Можеш да продължиш задачката като напишеш клас BigInteger например, в който енкапсулираш всички функции за работа с големи числа - събиране, изваждане, умножение, деление, степенуване... И можеш да се възползваш от operator overloading механизма на C++, така че тези обекти да могат да се ползват като променливи от вградените типове. Т.е. да можеш да правиш следното например :
BigInteger a, b;
cin >> a >> b;
BigInteger c = a * b;
BigInteger d = 4 + c / 2;
cout << c << d;
Поправката ти всъщност беше доста уместна, всъщност май това си
прави и оригиналният алгоритъм (макар и не точно в този ред, но горе-долу
същият брой операции).
Самият алгоритъм е много прост, но се разбира най-добре от нагледен
пример. Известен е от доста отдавна (средновековието:-). Има и други
интересни алгоритми, то те май не са толкова подходящи за компютри:-)
Така, че ето и програмката за умножение на две ''големи'' числа.
Както виждаш разликите са съвсем малко:-) А ти вече си разбрала
как работи, така че съм сигурен, че щеше да си го откриеш:-)
Да. Така е! Не правя проверка! Но има по-добър алгоритъм (поне така си мисля:-). Този е негов производен. И ако го напиша ще изнеса всичко в отделна функция. Тогава ще направя и проверката:-) Интересното е, че този алгоритъм може да се обърне за деление на ''големи'' числа.
Добра идея! Така можеш да извършваш повдигане на квадрат на много големи числа ;)
Обаче я пробвай да намериш квадрата на 's'. Според програмата ти отговорът е 09. Пропуснал си да проверяваш дали въведените символи са числа преди да ги записваш във вектора.