20.10.2010, 18:15. Просмотров 607. Ответов 2
Задача банальна: с клавиатуры вводится число, нужно его представить в виде суммы двух квадратов. Программа должна работать менее 1 секунды. Диапазон вводимых чисел 1) до 1е3 2) до 1е6 3) до 1е9 4) до1е16(это уже, как мне сказали, совсем тяжко).
Ну, в общем, вот я тут написал.
C++ |
1
2
3
4
5
6
7
8
9
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
| #include "stdio.h"
#include "conio.h"
#include "iostream"
using namespace std;
int main(){
int i, b, t=0;
long long N, a=0;
setlocale (LC_ALL, "Russian");
printf( "Введите число:");
cin >> N;
bool *kv;
kv = (bool*)calloc(1e14,sizeof(bool));
for (i=1;a<N;i+=2){
a+=i;
if (a<10e13)
kv[a]=1;
t++;}
kv[0]=1;
a=0;
for (i=1;a<N;i+=2){
a+=i;
t++;
if ((N-a)>0)
if (kv[N-a]==1){
cout << "\na=" << a << " b=" << N-a << " t=" << t << "\n";
cin >> b;
if (b==-1)
return 0;
}}
cout << "Сие не представляется возможным" << " t=" << t;
_getch();
return 0;
} |
|
Суть алгоритма, если надо будет, поясню.
Проблема вот в чем: если я ввожу число 9999999999(десять девяток) и более (с какого это начинается не знаю, не проверял) то вылетает ошибка "Необработанное исключение в "0x001d15a2" в "переборы.exe": 0xC0000005: Нарушение прав доступа при записи "0x10de66e9", и ссылаются на kv[a]=1;, причем в этот момент а=276457129. если бы "а" было больше размерности масива, я бы понял, а так 0_о
О :-)