HDOJ——简单题4(1020,1021)

这篇博客探讨了ACM编码方法,强调了理解子序列含义的重要性,并给出了1020题目的解题思路和代码。此外,还分析了1021题的斐波那契数列问题,指出直接计算可能引发溢出,应采用取模策略避免错误,并提供了正确解法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1020:

Encoding

Given a string containing only 'A' - 'Z', we could encode it using the following method:

1. Each sub-string containing k same characters should be encoded to "kX" where "X" is the only character in this sub-string.

2. If the length of the sub-string is 1, '1' should be ignored.

 

给一个字串只有'A'-'Z‘的字母,我们可以以下列方式来编码它。

注意第一条,它写的是sub-string,也就是子序列的意思。

我一开始以为是这个序列中所有额相同的字符都要统计在一起,然后写成kX的形式。

但是不对,是每碰到相同的字符,再把它们统计在一起,记为kX。 这是英语水平问题造成的debug.

附上代码:

#include<stdio.h>
#include<string.h>
int main()
{
    char a[10005];
    int n,i,j,k,l,t;
    scanf("%d",&n);
    for(i=1;i<=n;i++)
    {
        getchar();
        scanf("%s",a);
        l=strlen(a);
        for(j=0;j<=l-1;j++)
        {    t=1;
            while(a[j]==a[j+1])        //题目意思又看错了,我还以为它是要把总的字母个数汇合在一起,结果他是比较连续的,并且输出,用样例ABDBBDD就理解了 
            {
                t++; j++;
            }
            if(t==1) printf("%c",a[j]);
            else printf("%d%c",t,a[j]);
        }
        printf("\n");
    }
}

*对了,判断有几个相等在这里写成a[j]==a[j+1],这是个方法。

 

1021:

Fibonacci Again

There are another kind of Fibonacci numbers: F(0) = 7, F(1) = 11, F(n) = F(n-1) + F(n-2) (n>=2).

看似挺简单的一道题,但是直接写会错,不知道为什么。

正确代码:

#include<stdio.h>
__int64 f[1000001];
int main()
{
    int i,j,n;
    while(scanf("%d",&n)!=EOF)
    {
        f[0]=7; f[1]=11;
        for(i=2;i<=n;i++)
            f[i]=(f[i-1]+f[i-2])%3;            //太大了,要不停地mod吗? 
        if(f[n]%3==0) printf("yes\n");
        else printf("no\n");
    }
}

错误代码:

(不能用直接去算斐波那契数列的值之后再去判断除以3的余数是否等于0,这样子的话当n很大时,会溢出。所以要不停的取摸。)


 

#include<stdio.h>
int f[1000001];
int main()
{
    int i,j,n;
    while(scanf("%d",&n)!=EOF)
    {
        f[0]=7; f[1]=11;
        for(i=2;i<=n;i++)
            f[i]=f[i-1]+f[i-2];
        if(f[n]%3==0) printf("yes\n");
        else printf("no\n");
    }
}


 找规律也可以得出:

#include<stdio.h>
int main()
{
    int men[8], i, j, n;
    men[0] = 1;
     men[1] = 2;
     men[2] = 0;
     men[3] = 2;
     men[4] = 2;
     men[5] = 1;
     men[6] = 0;
     men[7] = 1;
    while(scanf("%d", &n) != EOF)
    {
        if(men[n%8]==0) printf("yes\n");
        else printf("no\n");
    }
}

一直在这几个值里面重复。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值