Есть код на с++ при работе с числами больше миллиона он работает больше чем 1 секунда где то на 0.1 надо чтобы он работал менее чем за секунду
#include <iostream>
#include <thread>
using namespace std;
bool f(int n) {
while (n) {
if (n & 1) return false;
n /=10;
}
return true;
}
int main() {
float a, b;
int count = 0, i;
cin >> a >> b;
for (i = a; i <= b; i++)
if (f(i)) count++;
cout << count;
}
C/C++
Помогите пожалуйста ускорить код
Тут естественнее сразу применить перечислительную комбинаторику для поиска количеств чётных цифр. Например, n-значных натуральных чисел с чётными цифрами ровно 4·5ⁿ/5. Надо найти номера нижней и верхней границ диапазона в списке чисел с чётными цифрами соответствующей значности (если они сами чётные, а если нет, то и этот случай надо программно обработать), посчитать сколько таких чисел не меньших чем а и не больше чем b, после чего прибавить количество чисел соответствующих значностей, лежащих между значностями чисел а и b. Как-то так. А этот код зачем ускорять? Его лучше сразу сдать в утиль, хотя, впрочем, float надо всего лишь заменить на int и тогда всё должно работать очень быстро если n всего-то где-то порядка миллиона..
Какую задачу решает этот код?
Зачем переменные a,b типа float?
Зачем переменные a,b типа float?
Алексей Зотов
Этот код считает количество чисел у которых в десятичной записи все цифры четные. я сделал флоат для того чтобы немного ускорить работу кода
инклуд Иострим
юсинг намеспасе стд;
int Fee( int& i)
{
static short mas[20];
int n = i;
short dig = 0;
while (n) { *(mas+dig) = n % 2; dig++; n /= 10;}
for (int j = dig - 1; j >= 0; j--)
if (mas[j]) { i += pow(10, j); return 0; }
i++;
return 1;
}
int main()
{
int a=1, n=100000000, count = 0;
for (int i=a; i<=n;)
count+=Fee(i);
cout << count;
}
Некоторые идеи в этом коде.
Логика такая:
Число разбивается на разряды. Если высший разряд нечетный - значит все комбинации ниже него можно смело пропустить. К примеру подается число 1000. 1 - нечетная, значит 1000 вариантов можно пропустить. И так далее.
Алгоритм правильно считает, от 1 до N. Уже устал сегодня доделывать избегание ошибки, если нижнее число уже со старшим нечетным разрядом. К примеру если первое число будет 1500, то пропустится все равно 1000 и счет будет с 2500 с потерей результатов от 2500 до 2999. Но думаю там элементарщина какая-то.
Скорость конская.
юсинг намеспасе стд;
int Fee( int& i)
{
static short mas[20];
int n = i;
short dig = 0;
while (n) { *(mas+dig) = n % 2; dig++; n /= 10;}
for (int j = dig - 1; j >= 0; j--)
if (mas[j]) { i += pow(10, j); return 0; }
i++;
return 1;
}
int main()
{
int a=1, n=100000000, count = 0;
for (int i=a; i<=n;)
count+=Fee(i);
cout << count;
}
Некоторые идеи в этом коде.
Логика такая:
Число разбивается на разряды. Если высший разряд нечетный - значит все комбинации ниже него можно смело пропустить. К примеру подается число 1000. 1 - нечетная, значит 1000 вариантов можно пропустить. И так далее.
Алгоритм правильно считает, от 1 до N. Уже устал сегодня доделывать избегание ошибки, если нижнее число уже со старшим нечетным разрядом. К примеру если первое число будет 1500, то пропустится все равно 1000 и счет будет с 2500 с потерей результатов от 2500 до 2999. Но думаю там элементарщина какая-то.
Скорость конская.
Danil Valchun
int first(int& i)
{
short masa[20]{};
int n = i;
int diff = 0;
short dig = 0;
while (n) { *(masa + dig) = n % 10; dig++; n /= 10; }
n = i;
for (int j = dig - 1; j >= 0; j--)
if (masa[j]%2)
return (masa[j] + 1)* pow(10, j) - n;
else
n = n - masa[j] * pow(10, j);
return 0;
}
int main()
{
int a, n, count = 0;
cin >> a >> n;
a = a + first(a); //вот та самая поправочка
for (int i=a; i<=n;)
count+=Fee(i); //функция из кода выше
cout << count;
}
{
short masa[20]{};
int n = i;
int diff = 0;
short dig = 0;
while (n) { *(masa + dig) = n % 10; dig++; n /= 10; }
n = i;
for (int j = dig - 1; j >= 0; j--)
if (masa[j]%2)
return (masa[j] + 1)* pow(10, j) - n;
else
n = n - masa[j] * pow(10, j);
return 0;
}
int main()
{
int a, n, count = 0;
cin >> a >> n;
a = a + first(a); //вот та самая поправочка
for (int i=a; i<=n;)
count+=Fee(i); //функция из кода выше
cout << count;
}
Danil Valchun
first(x) - возвращает приращение для корректной работы алгоритма.
first(1500) = 500, и первое число будет сразу 2000
first(2766) = 34, счет будет с 2800 и т. д.
first(1500) = 500, и первое число будет сразу 2000
first(2766) = 34, счет будет с 2800 и т. д.
Danil Valchun
до 1'000'000'000 считает за 0,46 секунд а с полным перебором - за 17 секунд.
Danil Valchun
#include < iostream >
using namespace std;
int variants(int t)
{
if (!t) return 1;
int count = 0;
int n = t;
int n10 = 1;
int dig = 0;
while (n) { dig++; n /= 10; n10 *= 10; }
n10 /= 10; n = t;
do
{
count += (n / n10 + 1) / 2 * pow(5, dig - 1);
if (n / n10 % 2) break;
n = n - (n / n10) * n10;
if (!n) { count++; break; }
n10 /= 10;
dig--;
} while (n > 0);
return count;
}
int main()
{
int a, b, count = 0;
cin >> a >> b;
cout << variants(b) - variants(a) + !a;
}
//мгновенный алгоритм
using namespace std;
int variants(int t)
{
if (!t) return 1;
int count = 0;
int n = t;
int n10 = 1;
int dig = 0;
while (n) { dig++; n /= 10; n10 *= 10; }
n10 /= 10; n = t;
do
{
count += (n / n10 + 1) / 2 * pow(5, dig - 1);
if (n / n10 % 2) break;
n = n - (n / n10) * n10;
if (!n) { count++; break; }
n10 /= 10;
dig--;
} while (n > 0);
return count;
}
int main()
{
int a, b, count = 0;
cin >> a >> b;
cout << variants(b) - variants(a) + !a;
}
//мгновенный алгоритм
Вот так сделай:
#include<stdio.h>
int f(int n)
{
while(n)
{
if(n & 1) return 0;
n/=10;
}
return 1;
}
int main()
{
int a, b, count = 0;
printf("Enter a: ");scanf("%d",&a);
printf("Enter b: ");scanf("%d",&b);
for (int i = a; i <= b; i++)
if (f(i)) count++;
printf("\n%d",count);
return 0;
}
#include<stdio.h>
int f(int n)
{
while(n)
{
if(n & 1) return 0;
n/=10;
}
return 1;
}
int main()
{
int a, b, count = 0;
printf("Enter a: ");scanf("%d",&a);
printf("Enter b: ");scanf("%d",&b);
for (int i = a; i <= b; i++)
if (f(i)) count++;
printf("\n%d",count);
return 0;
}
Orhan Aslanov
Ага. Надо только переписать на Си, и программа ускорится 100 раз :-)
Алексей Зотов
как сделать чтобы эти 2 числа считывалась в 1 строке?
int i = float a это как?
Orhan Aslanov
Это он так ускоряет код :-)
Вам уже надавали советов, лучшего я не придумаю.
Ну и до кучи: открепите потоки iostream от потоков stdio и отвяжите cin от cout. Программа будет меньше дёргать консоль.
Ну и до кучи: открепите потоки iostream от потоков stdio и отвяжите cin от cout. Программа будет меньше дёргать консоль.
Похожие вопросы
- Помогите пожалуйста написать код.(C++)
- Помогите пожалуйста написать код на c++, выводящий имя, фамилию и дату рождения нескольких человек
- Помогите пожалуйста написать код на C++
- Срочно!!! Помогите пожалуйста написать код к задачке на с++! Заранее спасибо!
- Помогите пожалуйста с кодом на с++
- Помогите пожалуйста с кодом....
- Помогите пожалуйста с кодом на с++
- С++, помогите пожалуйста с кодом, очень прошу, и можете коротко обьяснить код
- Помогите пожалуйста доработать код, язык С++
- Помогите, пожалуйста, написать код на C (Си)