一道编程题求救。走投无路…呜呜呜!!

如题所述

第1个回答  2015-11-29
long b[1000]; 改成 long* b = (long*)malloc(sizeof(long) * 1000);
第2个回答  2015-11-29
给组测试数据呢,你的代码在n很大的情况下会爆炸啊。追问

怎么修改,我是初学者,不大懂,望请假

Oj说runtime error

#include
long f(long n)
{
long q;
if(n==0)q=1;
else q=23*f(n-1)+233;
return q;}
int main(){
long y,n;
long b[1000];
int i,c;
i=0;c=0;
scanf("%ld",&n);
while(n!=-1){
c++;
y=f(n);
b[i++]=y%2333;
scanf("%ld",&n);
}
for(i=0;i<c;i++)
printf("%ld\n",b[i]);
return 0;
}

研究了一个半小时,求教你了

包含多组测试数据,对于每一组数据,输入n(0<=n<=10^18),当n=-1时,代表输入结束。

Sample Input:

0
1
2
-1

Sample Output:

1
256
1455

追答

32位计算机上long int表示不了10^18这么大的数,最好用long long。还有你计算f(n)用到了函数递归,n的规模太大了,递归可能申请不了那么大的内存空间。你给我原题看看,这么大的n,估计不该用递归来做。

追问

这个数列就叫“哈哈”数列:f(n)=23*f(n-1)+233, 守卫
给出一个数n,如果n能会回答出f(n)mod2333,守卫就让小鲜肉进入“哈哈”王国。你能帮小鲜肉A回答吗?(已知f(0)=1)

包含多组测试数据,对于每一组数据,输入n(0<=n<=10^18),当n=-1时,代表输入结束。

Output:

输出f(n)mod2333.

Sample Input:

0
1
2
-1

Sample Output:

1
256
1455

追答/*试试这个,不用计算f(n)的值,反正模2333之后一定会有循环节*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int f[3000],k,l;
int vis[3000];
void pre()
{
    int tmp=1,i;
    for(i=1;;++i)
    {
        tmp=(tmp*23+233)%2333;
        f[i]=tmp;
        if(vis[tmp]!=-1)
        {
            k=vis[tmp];
            l=i-k;
            break;
        }else vis[tmp]=i;
    }
}
int main()
{    
    //freopen("input.txt","r",stdin);
    //freopen("output.txt","w",stdout);
    memset(vis,-1,sizeof(vis));
    f[0]=1;
    vis[1]=0;
    pre();
    long long n;
    while(scanf("%lld", &n) && n!=-1)
    {
        n=(int)((n-k)%l+k);
        printf("%d\n", f[n]);
    }
    return 0;
}

追问

AC了,万分感激

那个,可以加你吗?
我是初学者,以后有什么问题可以请教你吗

本回答被提问者采纳
第3个回答  2015-11-29
程序呢追问

#include
long f(long n)
{
long q;
if(n==0)q=1;
else q=23*f(n-1)+233;
return q;}
int main(){
long y,n;
long b[1000];
int i,c;
i=0;c=0;
scanf("%ld",&n);
while(n!=-1){
c++;
y=f(n);
b[i++]=y%2333;
scanf("%ld",&n);
}
for(i=0;i<c;i++)
printf("%ld\n",b[i]);
return 0;
}

Oj说runtime error

自己电脑没错

求救呀

追答

应该是数组用的不对,爆掉了

追问

怎么修改

帮我下(>_<)

追答

现在身边没电脑==

相似回答