标题:hdu1005说运行时错误 为什么啊 求原因
只看楼主
末日泡沫
Rank: 1
等 级:新手上路
帖 子:18
专家分:0
注 册:2015-3-1
结帖率:100%
已结贴  问题点数:10 回复次数:15 
hdu1005说运行时错误 为什么啊 求原因
Problem Description
A number sequence is defined as follows:

f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7.

Given A, B, and n, you are to calculate the value of f(n).

Input
The input consists of multiple test cases. Each test case contains 3 integers A, B and n on a single line (1 <= A, B <= 1000, 1 <= n <= 100,000,000). Three zeros signal the end of input and this test case is not to be processed.

Output
For each test case, print the value of f(n) on a single line.

Sample Input
1 1 3
1 2 10
0 0 0
 
Sample Output
2
5

#include<stdio.h>
#include<math.h>
int main()
{
    int a,b;
    long long n;
    long long c[1000];
    int d;
    while(scanf("%d %d %lld",&a,&b,&n)==3)
    {
        c[1]=1;
        c[2]=1;
        for(d=3;d<=n;d++)
        {
            c[d]=(b*c[1]+a*c[2]);
            c[1]=c[2];
            c[2]=c[d];
        }
        if(a==0&&b==0&&n==0)
        break;
        printf("%lld\n",c[2]%7);
    }
    return 0;
}
搜索更多相关主题的帖子: multiple sequence number single 
2015-03-03 16:03
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
得分:0 
d <= n <= 100,000,000

当d >= 1000 时,c[d]越界了


[fly]存在即是合理[/fly]
2015-03-03 16:50
末日泡沫
Rank: 1
等 级:新手上路
帖 子:18
专家分:0
注 册:2015-3-1
得分:0 
回复 2楼 azzbcc
那要怎么修改呢?
2015-03-03 17:27
longwu9t
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:6
帖 子:732
专家分:2468
注 册:2014-10-9
得分:10 
程序代码:
#include <stdio.h>

int A, B, n;

int input(int *A, int *B, int *n) {
    while((scanf("%d %d %d", A, B, n) != 3 ||
            *A < 1 || *A > 1000 ||
            *B < 1 || *B > 1000 ||
            *n < 1 || *n > 100000000)) {
        if(*A == 0 && *B == 0 && *n == 0)
            return 0;

        while(getchar() != '\n')
            continue;
    }

    return 1;
}

int f(void) {
    int i = 3, v = 0, x = 1, y = 1;

    if(n < 3) v = 1;

    else {
        while(i++ <= n) {
            v = (A * x + B * y) % 7;
            y = x;
            x = v;
        }
    }

    return v;
}

int main(void) {
    int i = 0, j = 0, v[99] = {0};

    while(input(&A, &B, &n)) v[j++] = f();

    while(i < j) printf("%d\n", v[i++]);

    return 0;
}

Only the Code Tells the Truth             K.I.S.S
2015-03-03 18:43
longwu9t
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:6
帖 子:732
专家分:2468
注 册:2014-10-9
得分:0 
重写一遍代码(使用了临时文件 取消了数组)
程序代码:
#include <stdio.h>

int A, B, n;

int input(void) {
    while((scanf("%d %d %d", &A, &B, &n) != 3 ||
            A < 1 || A > 1000 ||
            B < 1 || B > 1000 ||
            n < 1 || n > 100000000)) {
        if(A == 0 && B == 0 && n == 0)
            return 0;

        while(getchar() != '\n')
            continue;
    }

    return 1;
}

int f(void) {
    int i = 3, v = 0, x = 1, y = 1;

    if(n < 3) v = 1;

    else {
        while(i++ <= n) {
            v = (A * x + B * y) % 7;
            y = x;
            x = v;
        }
    }

    return v;
}

int main(void) {
    char ch;
    FILE *tfp = tmpfile();

    while(input())
        fprintf(tfp, "%d\n", f());

    rewind(tfp);

    while(!feof(tfp))
        if((ch = fgetc(tfp)) != EOF)
            putchar(ch);

    return 0;
}

Only the Code Tells the Truth             K.I.S.S
2015-03-04 10:02
末日泡沫
Rank: 1
等 级:新手上路
帖 子:18
专家分:0
注 册:2015-3-1
得分:0 
回复 5楼 longwu9t
谢谢 我得好好消化一下你的代码
2015-03-04 10:07
longwu9t
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:6
帖 子:732
专家分:2468
注 册:2014-10-9
得分:0 
程序代码:
while(!feof(tfp))
        if((ch = fgetc(tfp)) != EOF)
            putchar(ch);

这一段我写的啰嗦了
改成下面这样就简洁些了
while((ch = fgetc(tfp)) != EOF)
            putchar(ch);

Only the Code Tells the Truth             K.I.S.S
2015-03-04 10:13
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
得分:0 
这显然是一个函数递归的题目,用什么数组、文件都是不得法的。

能编个毛线衣吗?
2015-03-04 10:28
longwu9t
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:6
帖 子:732
专家分:2468
注 册:2014-10-9
得分:0 
1 <= n <= 100,000,000
我试过递归 会超时
楼上有好的递归方案?

Only the Code Tells the Truth             K.I.S.S
2015-03-04 10:32
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
得分:0 
那就用简单循环吧,不需要设置那么大的数组,只需要用2个元素的数组存储f(n-1)、f(n-2)的值即可,代码如下(不知道在哪里验证,如不行望告知):
#include<stdio.h>
void main()
{
    int i,j,a,b,n,f[2];
    f[0]=1;f[1]=1;
    while(1)
    {
        scanf("%d%d%d",&a,&b,&n);
        if(a>=1&&b<=1000&&n>=3&&n<=100000000)
        {
            for(i=3;i<=n;i++)
            {
                j=(a*f[1]+b*f[0])%7;
                f[0]=f[1];
                f[1]=j;
            }
            printf("%d\n",j);
        }
        if(!(a||b||n))break;
    }
}

[ 本帖最后由 wmf2014 于 2015-3-4 11:06 编辑 ]

能编个毛线衣吗?
2015-03-04 11:00



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-442346-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.837146 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved