عدد مثلثی بیش از 500 مقسوم علیه - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

عدد مثلثی بیش از 500 مقسوم علیه

+1 امتیاز
سلام یک سوال دارم قبل توضیح سوال بگم که سختی این سوال محدودیت زمانیشه پس برنامتون دقت داشته باشید که باید زیر 1 دیقه اجرا شه

خب سوال

سوال میگه که اعداد مثلثی اینجوری تشکیل میشه

اولین عدد مثلثی ----->1

دومین عدد مثلثی----->1+2

سومین عدد مثلثی ---->1+2+3

چهارمین عدد مثلثی.....>1+2+3+4

.

..

 

.

.

n امین عدد مثلثی------>1+2+3+4+........+n

خب الان سوال ازشما اولین عدد مثلثی رو میخواد که بیش از 500 مقسوم علیه داره

زمان تو این سوال برام خیلی مهمه ها

هرکی تونست کدشو بزنه بفرسته
سوال شده اردیبهشت 8, 1393  بوسیله ی senator77 (امتیاز 226)   6 14 25
دوباره تگ گذاری شد اردیبهشت 8, 1393 بوسیله ی BlueBlade
حداقل سوال projecteuler رو کامل بذار!
کامل گذاشتم دیگه تازه بیشتر هم توضیح دادم
اینجوری فایده نداره بعد سورسش رو با پایتون برات میذارم

2 پاسخ

+2 امتیاز
 
بهترین پاسخ

شما اول تعداد تکرار مقسوم علیه های اول رو حساب میکنی میشه مثلا a,b,c,...

تعداد کل مقسوم علیه ها میشه

(a+1) (b+1) ...

اینم کد که به ثانیه هم نمیرسه :)

#include <iostream>
#include <vector>
#include <cmath>
#include <chrono>
#include <map>

using namespace std;

vector<unsigned long long>primes;

bool isPrime(unsigned long long num)
{
	if (primes.size() != 0 && primes[primes.size() - 1]> num)
		return false;

	if (num % 3 ==0 || num%2==0)
		return false;

	int half = pow(num, 0.5);

	for (unsigned long long i = 4; i <= half; i++)
	{
		if (num%i == 0)
			return false;
	}
	return true;
}


bool checkNumber(unsigned long long  number)
{
	if (isPrime(number))
		return true;

	map<int, int>primeDevisors;

     unsigned long long mmm = number;
	
	for (int i = 0; i<primes.size(); i++)
	{
		while (number%primes[i] == 0 && number >1)
		{
			number /= primes[i];
			primeDevisors[primes[i]]++;
		}
	}

	if (isPrime(number))
	{
		primeDevisors[number]++;
		number = 1;
	}
	unsigned long long n = number / primes[primes.size() - 1];
	for (unsigned long long i = primes[primes.size() - 1] + 1; i <= n; i++)
	{

		if (isPrime(i))
		{
			primes.push_back(i);
			while (number%i == 0 && number >1)
			{
				number /= i;
				primeDevisors[i]++;
			}
		}
	}
	int count = 1;
	for (auto i = primeDevisors.begin(); i != primeDevisors.end(); i++)
	{
	   count *= (i->second + 1 );
	   
	}
	if (count > 500)
	{
		cout << mmm<<"\n";
		return false;
	}

	return true;
}

int main()
{
	unsigned long long number = 1;
	primes.reserve(30000);
	primes.push_back(2);
	primes.push_back(3);

	auto start = chrono::steady_clock::now();

	while (checkNumber(number))
	{
		number +=  (number+1);
	}

	auto end = chrono::steady_clock::now();
	auto diff = end - start;
	cout << chrono::duration <double, milli>(diff).count() << " ms" << endl;
	cout << chrono::duration <double, nano>(diff).count() << " ns" << endl;
}

 

پاسخ داده شده اردیبهشت 8, 1393 بوسیله ی BlueBlade (امتیاز 15,315)   15 18 89
انتخاب شد اردیبهشت 9, 1393 بوسیله ی senator77
0 امتیاز
#[email protected]
def tedadmaghsoom(number):
    zarb=1
    for i in range(2,number):
        buf=0
        if number % i == 0 :
            for j in range(1, number+1):
                if number % i ==0 :
                    buf += 1
                    number=int(number / i)
                else:
                    break
        if buf != 0:
            zarb *= (buf+1)
    return zarb
def mosalasi(n):
    return ((n**2)+n)/2
a=input("please Enter adad koochiktar (adade bozorgtare 5): ")
i=5
while (int(tedadmaghsoom(int(mosalasi(i)))) < int(a)) :
    i += 1
print("\n",i)

هر عددی میخوای وارد کن مثلا 500

پاسخ داده شده اردیبهشت 10, 1393 بوسیله ی Fire360Boy (امتیاز 2,524)   6 24 43
ویرایش شده اردیبهشت 10, 1393 بوسیله ی Fire360Boy
...