网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
12月26日漏签0天
c语言吧 关注:801,662贴子:4,374,136
  • 看贴

  • 图片

  • 吧主推荐

  • 视频

  • 游戏

  • 9回复贴,共1页
<<返回c语言吧
>0< 加载中...

救急。。。。。。。

  • 只看楼主
  • 收藏

  • 回复
  • 其水如鱼
  • 便当
    3
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
题目如下:
问题类似Fibonacci序列,就是兔子生育的问题,只不过兔子长大的月数变成了变量m,然后计算d月后共有多少个兔子。输入整数m,d,输出为d月后兔子的总数。当m=d=0时程序结束。
样例输入
2 3
3 5
1 100
0 0
样例输出
5
9
1267650600228229401496703205376
然后是我写的代码:
#include<stdio.h>
void prt(int n) //顺序输出整数的每一位数
{
if(n<10) printf("%d",n);
else{
n=n/10;
prt(n);
printf("%d",n%10);
}
}
int rabbits(int m,int d){ //计算d月后兔子总数
//int k;
if(d<=m) return d+1;
else{
return (rabbits(m,d-1)+rabbits(m,d-m));
}
}
int main()
{
int m,d;
while(scanf("%d%d",&m,&d)!=EOF){
if(m==0&&d==0)break;
else{
prt(rabbits(m,d));
printf("\n");
}
}
return 0;
}
输入小点的数可以输出,程序也没有问题,但是输入m=1,d=100的时候输出不了了,要怎么处理这么大的数使其可以输出?


  • 咱用手机上_
  • 麻婆豆腐
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
用数组模拟int型,可以处理理论上无限制长度的数


2025-12-26 20:22:49
广告
不感兴趣
开通SVIP免广告
  • 其水如鱼
  • 便当
    3
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
别沉啊,大神帮帮忙啊


  • free逍遥星空
  • 团子家族
    10
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
这初始化兔子数目不对吧。2 3就成5了。。


  • free逍遥星空
  • 团子家族
    10
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct _BigInteger
{
#define LEN (1000)
char bits[LEN];
int length;
struct _BigInteger* (*construct)(struct _BigInteger *, int);
struct _BigInteger* (*add)(struct _BigInteger *, struct _BigInteger *);
char*(*toString)(struct _BigInteger *);
}BigInteger;
struct _BigInteger* BigInteger_construct(struct _BigInteger * bthis, int number)
{
memset(bthis->bits, 0, sizeof(char)*(LEN));
bthis->length = 0;
do
{
bthis->bits[bthis->length++] = number % 10;
} while (number /= 10);
return bthis;
}
struct _BigInteger* BigInteger_add(struct _BigInteger * bthis, struct _BigInteger* a)
{
int limit = bthis->length > a->length ? bthis->length : a->length;
for (int i = 0; i < limit; i++)
{
bthis->bits[i] += a->bits[i];
bthis->bits[i + 1] += bthis->bits[i] / 10;
bthis->bits[i] = bthis->bits[i] % 10;
}
bthis->length = bthis->bits[limit] ? limit + 1 : limit;
return bthis;
}
char* BigInteger_toString(struct _BigInteger *bthis)
{
char* rs = (char*)malloc(sizeof(char)*(bthis->length + 1));
for (int i = bthis->length - 1, j=0; i >= 0; --i, j++)
rs[j] = bthis->bits[i] + '0';
rs[bthis->length] = '\0';
return rs;
}
struct _BigInteger* BigInteger_new(int number)
{
struct _BigInteger* a = (struct _BigInteger*)malloc(sizeof(struct _BigInteger));
a->construct = BigInteger_construct;
a->add = BigInteger_add;
a->toString = BigInteger_toString;
a->construct(a, number);
return a;
}
inline int mod(int a, int b)
{
return a%b < 0 ? b + a%b : a%b;
}
char* rabbits(int m, int d){ //计算d月后兔子总数
int modnum = m + 1;
BigInteger** arrptr = (BigInteger**)malloc(sizeof(BigInteger*)*modnum);
for (int i = 0; i < modnum; i++)
arrptr[i] = BigInteger_new(0);
arrptr[1]->construct(arrptr[1], 1); //arr[1] = 1;
// arr[d] = arr[d-1]+arr[d-m]
for (int i = 2; i <= d; i++)
{
arrptr[mod(i, modnum)]->construct(arrptr[mod(i, modnum)], 0);
arrptr[mod(i, modnum)]->add(arrptr[mod(i, modnum)], arrptr[mod(i-1, modnum)]);
arrptr[mod(i, modnum)]->add(arrptr[mod(i, modnum)], arrptr[mod(i-m, modnum)]);
}
char * ptr = arrptr[d%modnum]->toString(arrptr[d%modnum]);
for (int i = 0; i < modnum; i++)
free(arrptr[i]);
free(arrptr);
return ptr;
}
int main()
{
int m, d;
while (scanf("%d%d", &m, &d) != EOF){
if (m == 0 && d == 0)break;
else{
char *a = rabbits(m, d);
printf("%s\n", a);
free(a);
}
}
return 0;
}
写了一下面向对象的东西,大数加法有了,自己调吧,其他应该和初始化的值有关了。还是C++好,C这种东西越写越**


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 9回复贴,共1页
<<返回c语言吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示