Премини към съдържанието
Форумът в приложение

По-лесно сърфиране. Научи повече.

Kaldata.com - Форуми

Приложение на форума на цял екран с push известия, значки и други.

За да инсталирате това приложение на iOS и iPadOS
  1. Докоснете Иконата за споделяне в Safari
  2. Превъртете менюто и докоснете Добавяне към началния екран.
  3. Докоснете Добавяне в горния десен ъгъл.
За да инсталирате това приложение на Android
  1. Докоснете менюто с 3 точки (⋮) в горния десен ъгъл на браузъра.
  2. Докоснете Добавяне към началния екран или Инсталиране на приложение.
  3. Потвърдете, като докоснете Инсталиране.

Добре дошли!

Добре дошли в нашите форуми, пълни с полезна информация. Имате проблем с компютъра или телефона си? Публикувайте нова тема и ще намерите решение на всичките си проблеми. Общувайте свободно и открийте безброй нови приятели.

Моля, регистрирайте се за да публикувате тема и да получите пълен достъп до всички функции.

 

C++ Помощ със задачи

Featured Replies

1. Простите числа p и q наричаме числа близнаци, ако q = p + 2. Например 5 и 7 са числа близнаци. Да се на пише програма, която прочита от стандартния вход цяло положително число n (n < 100000) и извежда на стандартния изход първите n двойки числа близнаци — всяка двойка на отделен ред, самите числа разделени с интервал.

Пример:

Вход

Изход

3

3 5

5 7

11 13

 

2. Да се напише програма, която прочита от стандартния вход две естествени числа a и b (a и b са по-малки от 4000000000) и извежда на екрана броя на срещанията на a в десетичния запис на b. Например, a = 84 се съдържа 3 пъти в b = 6845848456, a = 70 се съдържа 1 път в b = 8574704 и a = 55 се съдържа 3 пъти в b = 5555. Срещанията могат да се припокриват.

Пример:

Вход

Изход

4 98454

2

123 949512

0

43 43056543

2

77 877677747

3

3. Да се напише програма, която прочита две цели числа, побиращи се в тип int, и проверява дали множествата от цифрите им съвпадат. Програмата да извежда “Yes” при съвпадение и “No” в противен случай. Числата могат да бъдат и отрицателни. В такъв случаи минусът се “игнорира”, т.е едно отрицателно число има същото множество от цифри като абсолютната си стойност.

Пример:

Вход

Изход

123 312

Yes

12 1523

No

-43 340

No

-675678 8765

Yes

 

4.Да се напише програма, която прочита от стандартния вход две числа от тип unsigned и проверява дали след задраскване на някоя цифра от първото, може да се получи второто. Ако е възможно, на стандартния изход да се изведе “Yes”, в противен случай “No”.

 

Примери:

Вход

Изход

123 12

Yes

75648 7648

Yes

423 41

No

12 1

Yes

4 13

No

 

 

5.Направете суматор за числа, записани в различна бройна система от десетична. Суматорът да приема от стандартния вход три цели числа — n, m и k, където k e основата на бройната система, в която са записани n и m. На стандартния изход да се извежда сумата на двете числа, отново записана в k-ична бройна система. Ако поне едно от числата  m или n не е валидно число в посочената система, да се изведе низът “Bad input data!”.

Ограничения:

  • 2 ≤ k ≤ 10

  • 0 m, n ≤ 500000 (имат се предвид стойностите на числата m и n)

 

Примери:

Вход

Изход

250 340 10

590

110 11 2

1001

54 453 8

527

421 340 5

1311

645 342 6

Bad input data!

Редактирано от Kristian Panov (преглед на промените)

#include <iostream>
#include <cmath>

using namespace std;

bool is_prime(int n)
{
    int r = (int)sqrt(n);
    int i = 2;
    while (i <= r && n % i != 0) i++;
    return i > r;   
}

int main()
{
    int n;
    
    cin >> n;
    
    int pairs = 0;
    
    int last_prime = -1;    
    int i = 2;
    while (true)
    {
        if (is_prime(i))
        {
            if (i == last_prime + 2)
            {
                cout << last_prime << ' ' << i << '\n';
                if (++pairs == n) break;
            }
            last_prime = i;
        }
        i++;
    }
}

Ето първата. Не е много бързо решение, но поне ползва малко памет.

  • Автор

A мерси :Д
То аз първата я реших:
 

#include <iostream>
#include <math.h>
#include <windows.h>
using namespace std;
bool isTwin(int number)
{
    if (number == 1 || number == 2)
        return true;
    for (int i = 3; i * i <= number; i+=2)
    {
    if (number % i == 0)
        return false;
    }
    return true;
}
int main(){
    int numberOfSets;
    int SetsFound = 0;
    int twinNumber = 3;
    cout << "How many twins do you want to find: ";
    cin >> numberOfSets;
    system("cls");
    cout << "Twins to find: " << numberOfSets << endl << endl;
    while (SetsFound < numberOfSets)
    {
    if (isTwin(twinNumber) && isTwin(twinNumber + 2))
    {
    cout << twinNumber << ", " << twinNumber + 2 << endl;
    SetsFound++;
    }
    twinNumber += 2;
    }
    return 0;
}


 

 

Не знам чий код е по добър.
Също и втората успях:


 

#include <iostream>
#include <string>
using namespace std;

int NumberOccurrenceCount(std::string const & str, std::string const & NumberToSearchFor)
{
    int count(0);
    std::string::size_type number_pos(0);
    while( number_pos!=std::string::npos )
    {
        number_pos = str.find(NumberToSearchFor, number_pos);
        if(number_pos != std::string::npos)
        {
            count++;
            number_pos += NumberToSearchFor.length();
        }
    }
    return count;
}
int main()
{

    string SearchFromNumber,NumberToSearchFor;
    cout << "Number to search for: ";
    cin>>NumberToSearchFor;
    cout << "Number to search from: ";
    cin>>SearchFromNumber;
    cout<<NumberToSearchFor<<" appears "<<NumberOccurrenceCount(SearchFromNumber,NumberToSearchFor) << " times" << endl << endl;

    return 0;
}

 

А за пета имаш ли някакви идеи?

 

Редактирано от Kristian Panov (преглед на промените)

За втората задача трябва вместо

number_pos += NumberToSearchFor.length();

Трябва да е

number_pos++

Защото пише, че може да се припокриват срещанията на числото.

Можеш да използваш strtol от <cstdlib> да преобразува числата в long int. След това може да се сумират и трябва да ги изведеш в съответната бройна система, за което си има лесен алгоритъм с оператора %.

Ето едно от многото решения на 3.

#include <iostream>
#include <string>
#include <vector>

using namespace std;

vector<int> strtoset(const string& a)
{
    vector<int> v(10);
    
    for (int i = 0; i < a.length(); ++i)
    {
        if (a[i] != '-') v[a[i] - '0'] = 1;
    }
    
    return v;
}

int main()
{
    string a, b;
    
    cin >> a >> b;
    
    vector<int> av = strtoset(a);
    vector<int> bv = strtoset(b);
    
    if (av == bv)
    {
        cout << "Yes\n";        
    }
    else
    {
        cout << "No\n";
    }
}

 

Ето го и моят вариянт за 5.

#include <iostream>
#include <string>

using namespace std;

void output(int value, int base)
{
    if (value < base)
    {
        cout << value;
        return;
    }
    output(value / base, base);
    cout << value % base;
}

int input(string value, int base)
{
    int r = 0;
    for (string::iterator it = value.begin(); it != value.end(); it++)
    {
        int digit = *it - '0';
        if (digit >= base) throw 666;
        r = r * base + digit;
    }
    return r;
}

int main()
{
    string n, m;
    int a, b, k;

    cin >> n >> m >> k;
    
    try {
        a = input(n, k);
        b = input(m, k);
        output(a + b, k);
        cout << "\n";
    } catch (int)
    {
        cout << "Bad input data!\n";
    }
}

Все пак трябва да се проверява за Bad input data.

мислех си да се направи самото събиране така че да се получава число

в десетична бройна система което да изглежда като търсеното.

проверките за коректност на числата са вкарани пак в него.

#include <iostream>

using namespace std;

int sum(int n, int m, int b)
{
    int r=0,p=1,c=0;
    if (n<0||m<0||b<2) return -1;
    while (n || m)
    {
        int t=n%10;
        if (t >= b) return -1;
        if (m%10 >= b) return -1;
        t += m%10+c;
        if (t >= b) {t -= b; c = 1;}
        else c=0;
        r += t*p;
        p*=10;
        n/=10;
        m/=10;
    }
    if (c) r += p;
    return r;
}

int main()
{
    int a,b,base,s;
    while (1)
    {
         cin>>a>>b>>base;
         s=sum(a,b,base);
         if (s==-1) cout<<"Bad input data!\n";
         else cout<<s<<endl<<endl;
    }
}

 

За третата можеш да запишеш цифрите на числата в два масива, да сортираш масивите и да ги сравниш.

Няма нужда да са масиви или да ги сортираш за да ги сравниш

#include <iostream>

using namespace std;

int toset(int x)
{
    int s=(x==0);
    if (x<0) x=-x;
    while (x)
    {
        s |= 1<<(x%10);
        x/=10;
    }
    return s;
}

int main()
{
    int a,b;
    while (1)
    {
         cin>>a>>b;
         cout<<((toset(a)==toset(b))?"Yes":"No")<<"\n\n";
    }
}

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void printnumber(int mint, int radix)
{
	if (mint == 0)
	{
		return;
	}
	printnumber(mint / radix, radix);
	printf("%d", mint % radix);
}

int main()
{
	char n[24];
	char m[24];
	int k, nnumber, mnumber, sum, len, i;
	scanf("%s", n);
	scanf("%s", m);
	scanf("%d", &k);
	if ((k < 2) || (k > 10))
	{
	bad:
		printf("Bad input data!");
		return -1;
	}
	len = strlen(n);
	for (i = 0; i < len; i++)
	{
		if (n[i] - '0' >= k) goto bad;
	}
	len = strlen(m);
	for (i = 0; i < len; i++)
	{
		if (m[i] - '0' >= k) goto bad;
	}
	nnumber = strtol(n, 0, k);
	mnumber = strtol(m, 0, k);
	sum = nnumber + mnumber;
	if (sum == 0) printf("0");
	else printnumber(sum, k);
	return 0;
}

 

Тези задачи не са от състезания, а от домашно за първи курс от ФМИ(https://docs.google.com/document/d/1reVg4fwGZO52H1qsmDyWZ161pE9_abj1xUktf-cmmR8/edit). Ако предам и аз този код сега какво ли ще стане :eek:

Редактирано от RandomGuy (преглед на промените)

Архивирана тема

Темата е твърде стара и е архивирана. Не можете да добавяте нови отговори в нея, но винаги можете да публикувате нова тема, в която да продължи дискусията. Регистрирайте се или влезте във вашия профил за да публикувате нова тема.

Разглеждащи това в момента 0

  • Няма регистрирани потребители разглеждащи тази страница.

Дарение

  • Подкрепи съществуването на форума - направи дарение
    25%
    Дарени 252.69 EUR от нужните 1,000.00 EUR

Бюлетин

Получавайте известие, когато има важна промяна или новина свързана с форума.

Профил

Навигация

Търсене

Търсене

Конфигуриране на push известия в браузъра

Chrome (Android)
  1. Докоснете иконата на катинар до адресната лента.
  2. Докоснете Разрешения → Известия.
  3. Променете предпочитанията си.
Chrome (Desktop)
  1. Кликнете върху иконата на катинар в адресната лента.
  2. Изберете Настройки на сайта.
  3. Намерете Известия и коригирайте предпочитанията си.