SIGSEGV "3n + 1"
SIGSEGV "3n + 1"
100 - The 3n + 1
问题http://www.spoj.com/problems/PROBTRES/我总是得到这个>>运行时错误(SIGSEGV)<lt<为什么plz帮忙!
背景:计算机科学中的问题通常被归类为某一类问题(例如,NP、不可解、递归)。在这个问题中,您将分析一个算法的属性,该算法的分类对于所有可能的输入都是未知的。
问题:
考虑以下算法:
1. input n
2. print n
3. if n = 1 then STOP
4. if n is odd then n = 3n + 1
5. else n = n / 2
6. GOTO 2
给定输入22,将打印以下数字序列22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1
据推测,对于任何积分输入值,上述算法都将终止(当打印1时)。尽管算法很简单,但尚不清楚这个猜想是否成立。然而,已经验证了,对于所有整数n,0 < n < 1,000,000
(事实上,对于比这多得多的数字)
给定输入n,可以确定打印的数字的数量(包括1)。对于给定的n,这被称为n的循环长度。在上面的例子中,22的循环长度是16。
对于任意两个数字i和j,您需要确定i和j之间所有数字的最大循环长度。
输入:输入将由一系列整数对i和j组成,每行一对整数。所有整数都将小于1000000且大于0。
您应该处理所有整数对,并为每对确定i和j之间(包括i和j)所有整数的最大循环长度。
您可以假设没有操作溢出32位整数。
输出:对于每对输入整数i和j,您应该输出i、j以及介于i和j之间(包括i和j)的整数的最大循环长度。这三个数字应该用至少一个空格隔开,所有三个数字都在一行上,每行输入都有一行输出。整数i和j必须以与它们在输入中出现的顺序相同的顺序出现在输出中,并且后面应该紧跟最大循环长度(在同一行)。
Sample Input:
1 10
100 200
201 210
900 1000
Sample Output:
1 10 20
100 200 125
201 210 89
900 1000 174
#include <iostream>
using namespace std ;
long int a[1000001];
long int F (long int n){
if(a[n]!=0)
return a[n];
else {
if(n%2 !=0)
a[n]=F(n*3+1)+1 ;
else
a[n]=F(n/2)+1 ;
return a[n];
}
}
int main(){
a[1]= 1 ;
long int i , j , MX , MN , x=0 ;
while (cin>>i >> j ){
MX=max(i,j);
MN=min(i,j);
for(;MN<=MX;MN++){
if(x<F(MN))
x=F(MN) ;
}
cout<<i<<" "<<j<<" "<<x<<endl;
x= 0;
}
return 0 ;
}
这和我的代码有什么区别?!!!
#include <stdio.h>
#include <stdlib.h>
#define MAX 1000001
static int result[MAX];
int calculate(unsigned long i);
int main()
{
unsigned long int i = 0;
unsigned long int j = 0;
unsigned long int k = 0;
int max,x,y;
result[1] = result[0] = 1;
while (scanf("%ld",&i)!= EOF)
{
scanf("%ld",&j);
if (i > j)
{
x = i;
y = j;
}
else
{
x = j;
y = i;
}
max = 0;
for (k = y; k <= x; k++)
{
if (result[k] != 0 && result[k] > max)
max = result[k];
else if (calculate(k) > max)
max = result[k];
}
printf("%ld %ld %dn",i,j,max);
}
return 0;
}
int calculate(unsigned long i)
{
if (i < MAX && result[i])
return result[i];
if ( i % 2 == 1 )
{
if (i < MAX)
return result[i] = 2+calculate((3*i+1)/2);
else
return 2+calculate((3*i+1)/2);
}
else
{
if( i < MAX)
return result[i] = 1 + calculate(i / 2);
else
return 1 + calculate(i /2 );
}
}
您可以检查n
的实际值范围,因为它可能超出了您的数组long a[1000001]
。此外,您还可以检查递归深度。如果递归太深,就会溢出堆栈。
我会考虑添加一个断言来测试n(即assert(n < 1000001)
),也许还可以添加一个递归深度变量来检查递归深度,作为诊断和调试此代码的第一步。您可以在<cassert>
中找到assert。
- 创建LinkedList退出,返回代码为-11(SIGSEGV)
- SIGSEGV 使用shared_ptr引用时
- SIGSEGV, 分段错误. 而 printf() 数组索引的值
- SIGSEGV on Boost UDP 套接字关闭 - tcache_get at malloc.c.
- 分段故障 运行C++代码时出现 SIGSEGV
- 为什么我的递归代码给出 sigsegv 错误?
- 在使用堆栈为下一个最大数字编写代码时面临 SIGSEGV(分段错误)
- 在Hackerearth上获取运行时错误(SIGSEGV),无法找出代码中的问题
- 为什么在环路条件中使用'<='而不是'<'会产生分段错误 [SIGSEGV]?
- C++ - 程序接收信号SIGSEGV,分段错误.In msvcrt!memcpy () (C:\Windows\S
- 使用 dlopen 在 Mac 上加载 libjvm.dylib 时发出信号 SIGSEGV
- SIGSEGV通过写入局部变量
- 哪个部分导致"SIGSEGV"错误以及如何修复它?
- 进程过早退出,并发出 SIGSEGV 信号
- 我的代码上的运行时错误 sigsegv
- SIGSEGV 因为基/派生类的继承问题
- sqlite3 程序接收信号 SIGSEGV,分段错误在 sqlite3_get_table ()
- std::map to std::list leads to SIGSEGV
- 视觉 SIGSEGV 在C++碰撞预防
- SIGSEGV "3n + 1"