пустой выходной файл при завершении поиска - PullRequest
0 голосов
/ 04 июля 2018

Я работаю над проблемой полного поиска и просмотрел код, но не мог понять, почему моя программа продолжает приходить с ошибкой пустого выходного файла. Может ли кто-нибудь помочь мне выяснить, почему это происходит? Ниже приводится постановка задачи, а затем мой код.

ПОСТАНОВКА ЗАДАЧИ : Палиндромы - это числа, которые читаются одинаково вперед и назад. Число 12321 является типичным палиндромом.

Учитывая числовое основание B (2 <= B <= 20 основание 10), выведите все целые числа N (1 <= N <= 300 основание 10) так, чтобы квадрат N был палиндромным при выражении в основании B; также напечатайте значение этого палиндромного квадрата. Используйте буквы «А», «В» и т. Д. Для обозначения цифр 10, 11 и т. Д. </p>

Выведите число и квадрат в основании B.

МОЙ КОД:

#include <iostream>
#include <cmath>
#include <algorithm>
#include <fstream>
#include <string>

using namespace std;

//utility function to raise number to a power
int power(int first, int second)
{
    int total = 1;
    for (int i = 0; i < second; i++)
    {
        total *= first;
    }
    return total;
}

//convert the number to the proper base
int convert(string num, int base1)
{
    int sum = 0;
    for (int i = num.size() - 1; i >= 0; i--)
        sum += num[i] * power(base1, num.size() - i);
    return sum;
}

//test if converted number is a palindrome
bool is_pal(int number)
{
    //if the #ofdigits is even
    if (number % 2 == 0)
    {
        int mid = (to_string(number).size()) / 2;
        string str_num = to_string(number);
        string half1;
        for (int i = 0; i < mid; i++)
            half1 += str_num[i];
        string half2;
        for (int i = str_num.size()-1; i > mid-1; i--)
            half2 += str_num[i];
        if (half1 == half2)
            return true;
        return false;
    }
    //if the #ofdigits is odd
    else
    {
        int mid1 = (to_string(number).size() - 1) / 2;
        int mid2 = (to_string(number).size() + 1) / 2;
        string str_num = to_string(number);
        string half1;
        for (int i = 0; i < mid1; i++)
        {
            half1 += str_num[i];
        }
        string half2;
        for (int i = str_num.size()-1; i > mid2-1; i--)
        {
            half2 += str_num[i];
        }
        if (half1 == half2)
            return true;
        return false;
    }
}
int main()
{
    ofstream fout("palsquare.out");
    ifstream fin("palsquare.in");
    int base;
    fin >> base;

    for (int i = 1; i < 300; i++)
    {
        if (is_pal(convert(to_string((power(i, 2))), base)))
        {
            fout << convert(to_string(i), base) << " " << convert(to_string(power(i, 2)), base) << "\n";
        }
    }
    return 0;
}

1 Ответ

0 голосов
/ 05 июля 2018

В дополнение к моим комментариям, обычный шаблон для преобразования числа в базу B имеет вид:

std::string convert_base(int B, int num)
{
    assert(B>1&&num>=0);
    char const digits[] ="0123456789AB...Z";
    std::vector<char> str;
    do
    {
        int const d = num%B;
        num /= B;
        str.push_back(digits[d]);
    } while(num);

    return std::string(str.rbegin(), str.rend());
}

Полный ответ тогда:

bool is_pal(std::string const & str)
{
    return std::equal(str.cbegin(), str.cend(), std.crbegin());
}

int const pow2_i = i*i;
std::string const pow2_baseB = convert_base(B, pow2_i);
if(is_pal(pow2_baseB)) ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...