zoukankan      html  css  js  c++  java
  • USACO-palsquare 遇到的一个坑

     1 /**
     2 ID: njuwz151
     3 TASK: palsquare
     4 LANG: C++
     5 */
     6 #include <iostream>
     7 #include <cstdio>
     8 #include <cstring>
     9 
    10 using namespace std; 
    11 
    12 char baseTable[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K'};
    13 
    14 char* reverse(const char* src, int len);
    15 
    16 char* base10ToBaseN(int number, int base);
    17 
    18 int main() {
    19     freopen("palsquare.in", "r", stdin);
    20     freopen("palsquare.out", "w", stdout);
    21     int base;
    22     cin >> base;
    23     char* palNumber;
    24     char* palSquare;
    25     char* reverseSquare;
    26     for(int i = 1; i <= 300; i++) {
    27         if(!palNumber) {
    28             delete palNumber;
    29             palNumber = NULL;
    30         }
    31         palNumber = base10ToBaseN(i, base);
    32         if(!palSquare) {
    33             delete palSquare;
    34             palSquare = NULL;
    35         }
    36         palSquare = base10ToBaseN(i * i, base);
    37         if(!reverseSquare) {
    38             delete palSquare;
    39             palSquare = NULL;
    40         }
    41         reverseSquare = reverse(palSquare, strlen(palSquare));
    42         for(int j = 0; j < strlen(palSquare); j++) {
    43             if(palSquare[j] != reverseSquare[j]) {
    44                 break;
    45             }
    46             if(j == strlen(palSquare) - 1) {
    47                 cout << palNumber << " " << palSquare << endl;
    48             }
    49         }
    50     }
    51     return 0;
    52 } 
    53 
    54 char* reverse(const char* src, int len) {
    55     char* result = new char[len+1];
    56     for(int i = 0; i < len; i++) {
    57         result[i] = src[len - 1 - i];
    58     }
    59     result[len] = 0;
    60     return result;
    61 }
    62 
    63 char* base10ToBaseN(int number, int base) {
    64     char* result = new char[10];
    65     int len = 0;
    66     while(number != 0) {
    67         result[len] = baseTable[number % base];
    68         number /= base;
    69         len++;
    70     }
    71     result[len] = 0;
    72     return reverse(result, strlen(result));
    73 }

    这是原来的代码,在本机跑的时候没有问题,但是在评测的时候报错了。错误信息如下:

    program:_malloc.c:2392:_sysmalloc:_Assertion_`(old_top_==_initial_top_(av)_&&_old_size_==_0)_||_((unsigned_long)_(old_size)_>=_MINSIZE_&&_prev_inuse_(old_top)_&&_((unsigned_long)_old_end_&_(pagesize_-_1))_==_0)'_failed. -------------------

    在查阅资料之后,应该是说我的代码越界使用了内存,于是我重新写了代码。

     1 /**
     2 ID: njuwz151
     3 TASK: palsquare
     4 LANG: C++
     5 */
     6 #include <iostream>
     7 #include <cstdio>
     8 #include <cstring>
     9 #include <string>
    10 
    11 using namespace std; 
    12 
    13 string baseTable = "0123456789ABCDEFGHIJK";
    14 
    15 string reverse(string src);
    16 
    17 string base10ToBaseN(int number, int base);
    18 
    19 int main() {
    20     freopen("palsquare.in", "r", stdin);
    21     freopen("palsquare.out", "w", stdout);
    22     int base;
    23     cin >> base;
    24     for(int i = 1; i <= 300; i++) {
    25         string palNumber = base10ToBaseN(i, base);
    26         string palSquare = base10ToBaseN(i * i, base);
    27         string reverseSquare = reverse(palSquare);
    28         for(int j = 0; j < palSquare.size(); j++) {
    29             if(palSquare[j] != reverseSquare[j]) {
    30                 break;
    31             }
    32             if(j == palSquare.size() - 1) {
    33                 cout << palNumber << " " << palSquare << endl;
    34             }
    35         }
    36     }
    37     
    38     return 0;
    39 } 
    40 
    41 string reverse(string src) {
    42     int len = src.size();
    43     string result;
    44     for(int i = len - 1; i > -1; i--) {
    45         result += src[i];
    46     }
    47     return result;
    48 }
    49 
    50 string base10ToBaseN(int number, int base) {
    51     string result;
    52     while(number > 0) {
    53         result = baseTable[number % base] + result;
    54         number /= base;
    55     }
    56     return result;
    57 }

    使用了string 来替代数组,说起来我也不是专业写C/C++的,之前char数组和string混合使用出错了,就单用char数组解决问题了,但是这次没能用好char数组,说明我对内存管理还是有一定的认知缺乏。

     

  • 相关阅读:
    课下作业--微软拼音输入法评价
    课堂练习--找水王
    第十四周总结
    第一阶段意见评论
    第十三周总结
    梦断代码阅读笔记03
    第十二周总结
    用户模板与用户场景
    2020年寒假假期总结0205
    2020年寒假假期总结0204
  • 原文地址:https://www.cnblogs.com/NJUWZ/p/6953289.html
Copyright © 2011-2022 走看看