xwzh_2003 2016-11-20 06:46 采纳率: 0%
浏览 1414

C++ 函数返回值过大如何用char*储存之类的问题

之前做了一道题,题目原型:
总时间限制: 2000ms 单个测试点时间限制: 1000ms 内存限制: 131072kB
描述
对于一个2行N列的走道。现在用1*2,2*2的砖去铺满。问有多少种不同的方式。
下图是一个2行17列的走道的某种铺法。
输入
整个测试有多组数据,请做到文件底结束。每行给出一个数字N,0 <= n <= 250
输出
如题
样例输入
2
8
12
100
200
样例输出
3
171
2731
845100400152152934331135470251
1071292029505993517027974728227441735014801995855195223534251

本题可以用递归,公式为:
n=1,s(n)=1;
n=2,s(n)=3;
n>=3,s(n)=s(n-1)+2*s(n-2);

然而题目要求n最大为250,所以只能用高精度算法,我用的char*类型,并且用一个add函数计算两个字符串的和。但是是有问题的。
因而,想知道如何处理这种函数返回值过大必须用字符串储存,并且还要使用递归的问题。

谢谢大家。

代码如下:
#include
using namespace std;
int max(int a,int b){return a>=b?a:b;}

char* add(char* a, char* b)
{
int al=strlen((const char*)a);

int bl=strlen((const char*)b);

int m=max(al,bl);

int c=new int[m];

int *d=new int[m];
int *s=new int[m+1];
for(int i=0;i<m+1;i++)
s[i]=0;

for(int i=0;i<al;i++)
c[i]=(int)(a[al-1-i]-48);

for(int i=0;i<bl;i++)

d[i]=(int)(b[bl-1-i]-48);

for(int i=al;i<m;i++)
c[i]=0;
for(int i=bl;i<m;i++)
d[i]=0;
for(int i=0;i<m;i++)
{
s[i]+=(c[i]+d[i])%10;

s[i+1]+=(c[i]+d[i])/10;
}
char
o=new char[m+1];
for(int i=0;i<m+1;i++)
{
o[i]=(char)(s[m-i]+48);
}
delete []c;
delete []d;
delete []s;
return o;
}
char* ta(int m)
{
if(m==1)
{
char* a=new char[1];
a[0]=1;
return a;
}
if(m==2)
{
char* b=new char[1];
b[0]=3;
return b;

}
return add(ta(m-1),add(ta(m-2),ta(m-2)));
}

void main()
{
int n;
cin>>n;
char* s=ta(n);
for(int i=0;i<strlen((const char*)s);i++)
cout<<s[i];
system("pause");
}

  • 写回答

1条回答 默认 最新

  • devmiao 2016-11-20 12:47
    关注
    评论

报告相同问题?

悬赏问题

  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程
  • ¥15 redis-full-check比较 两个集群的数据出错
  • ¥15 Matlab编程问题
  • ¥15 训练的多模态特征融合模型准确度很低怎么办
  • ¥15 kylin启动报错log4j类冲突
  • ¥15 超声波模块测距控制点灯,灯的闪烁很不稳定,经过调试发现测的距离偏大
  • ¥15 import arcpy出现importing _arcgisscripting 找不到相关程序