Премини към съдържанието

Препоръчан отговор


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 (преглед на промените)

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Добавете отговор

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

Гост
Напишете отговор в тази тема...

×   Вмъкнахте текст, който съдържа форматиране.   Премахни форматирането на текста

  Разрешени са само 75 емотикони.

×   Съдържанието от линка беше вградено автоматично.   Премахни съдържанието и покажи само линк

×   Съдържанието, което сте написали преди беше възстановено..   Изтрий всичко

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Добави ново...

Информация

Поставихме бисквитки на устройството ви за най-добро потребителско изживяване. Можете да промените настройките си за бисквитки, или в противен случай приемаме, че сте съгласни с нашите Условия за ползване