2017-01-10 133 views
-1

所以我得到这个编程入门任务,我必须写一个程序,找到的第n个成员按以下顺序1,121,1213121,121312141213121 ..等等。基本上,第一个成员是1,而下一个成员是[前一个成员] [前一个成员]。 N < 10.所以我得到了这个我不明白的问题,试图在互联网上搜索它,但没有得到任何可以帮助我的东西。堆损坏检测:普通块(#176)后

#include "stdafx.h" 
#include <iostream> 

using namespace std; 

int size(int n, int realsize); 
int main() 
{ 
    int n; 
    cin >> n; 
    if (n == 1) { 
     cout << "1"; 
     return 0; 
    } 
    int helper = 0; 
    char c = '2'; 
    char* look; 
    char* say; 
    say = new char[size(n, 1) + 1](); 
    look = new char[size(n - 1, 1) + 1](); 
    look[0] = '1'; 
    while (helper < n) { 
     for (int i = 0; i < size(helper + 1, 1); i++) { 
      say[i] = look[i]; 
     } 
     say[size(helper + 1, 1)] = c; 
     for (int i = size(helper + 1, 1) + 1; i < size(helper + 1, 1) * 2 + 1; i++) { 
      say[i] = look[i - (size(helper + 1, 1) + 1)]; 
     } 
     for (int i = 0; i < size(helper + 1, 1) * 2 + 1; i++) { 
      look[i] = say[i]; 
     } 
     helper += 1; 
    } 
    cout << say; 
    delete[] say; 
    delete[] look; 
    return 0; 
} 

int size(int n, int realsize) 
{ 
    if (n == 1) 
     return realsize; 
    else 
     return size(n - 1, realsize * 2 + 1); 
} 
+0

***检测到堆损坏:正常块后***您最有可能超出一个或多个动态数组的范围。 – drescherjm

+1

如果您使用'std :: vector '而不是动态分配,那么您可以使用'at()'来表明您要超出数组范围。 [见这里](http://ideone.com/1tVUXC)。最后一个循环出现问题('look [i] = say [i];')。由于您似乎在使用Visual Studio,因此在出错时应立即抛出“out_of_range”异常,而不是在程序终止时出现“堆损坏”错误, – PaulMcKenzie

回答

0

您正在覆盖您的look变量的容量。它最终以say的全部内容编写,因此它需要具有相同的大小。

虽然我不纵容下面的代码为好的代码,它已经从自己的实现最低限度的调整,应该给出一个更坚实的基础继续努力工作的结果。我用第一个数字测试了它,但这并不能保证它是完美的。

#include <iostream> 

using namespace std; 

int size(int n, int realsize); 

int main() 
{ 
    int n; 
    cin >> n; 
    if (n == 1) 
    { 
     cout << "1"; 
     return 0; 
    } 
    int helper = 0; 
    char c = '2'; 
    char * look; 
    char * say; 
    say = new char[size(n, 1) + 1];  // Ditch the() call, which is confusing. 
    look = new char[size(n, 1) + 1]; // Make the same size as "say" 
    look[0] = '1'; 
    while (helper < n - 1) // You're overrunning this loop I think, so I did it to n - 1. 
    { 
     for (int i = 0; i < size(helper + 1, 1); i++) 
     { 
      say[i] = look[i]; 
     } 
     say[size(helper + 1, 1)] = c + helper; // You were adding '2' every time, so this will add 2, 3, 4, etc incrementally. 
     for (int i = size(helper + 1, 1) + 1; i < size(helper + 1, 1) * 2 + 1; i++) 
     { 
      say[i] = look[i - (size(helper + 1, 1) + 1)]; 
     } 
     for (int i = 0; i < size(helper + 1, 1) * 2 + 1; i++) 
     { 
      look[i] = say[i]; 
     } 
     helper += 1; 
    } 
    say[size(n, 1)] = '\0'; // Null-terminate "say" before printing it out. 
    cout << say; 
    delete[] say; 
    delete[] look; 
    return 0; 
} 

int size(int n, int realsize) 
{ 
    if (n == 1) 
     return realsize; 
    else 
     return size(n - 1, realsize * 2 + 1); 
} 
+0

非常感谢!我修好了,它通过了我教授的测试。 :) –

+0

选择它作为答案呢? :) – Mitch

+0

我不知道如何,但我想我做到了:)。感谢帮助队友! –