例题3-5 生成元 UVa1583

算法竞赛入门经典(第2版)第3章 数组和字符串
例题3-5 生成元 UVa1583

感悟。

0、查看书中代码,对if(ans[y]==0||m<ans[y])心存疑虑。着手跟踪

if(ans[y]==0||m<ans[y]){
            if(m<ans[y])
                printf("m=%d ans[y]=%d y=%d\n",m,ans[y],y);
            ans[y]=m;
        }

打印如下:

m=99991 ans[y]=3811788 y=100028
m=99993 ans[y]=3811784 y=100032
m=99995 ans[y]=3811792 y=100036

很明显数组越界,书中ans数组范围0-100004。

建议修改如下:

if(y<=n&&ans[y]==0){
      ans[y]=m;
 }

1、隐隐感到此题,制表,查表最快,当不够坚定,瞄了一眼提示(未看代码),与所想一致,开始着手编程。

2、挺简单一道题,满心欢喜提交,竟然WA,果断查英文原题,原来输入输出格式有限制。

Sample Input
3
216
121
2005
Sample Output
198
0
1979

3、立马提交AC,查看书中代码比本人略胜一筹,做了本人想而未做的对应关系ans[y]=m。


附上代码:

环境Dev-cpp4.9.9.2

#include <stdio.h>

const int maxn=100000+10;
int a[maxn];
int bsum(int b){//获得整数各个位置的数字之和 
    int sum=0;
    while(b){
        sum+=b%10;
        b/=10;
    }
    return sum;
}
int main(){
    int i;
    int n;
    int T;
    for(i=1;i<=100000;i++){//制表 
        a[i]=bsum(i)+i;
    }
    scanf("%d",&T);
    while(T){
        T--;
        scanf("%d",&n);
        for(i=1;i<n;i++){//查表 
            if(a[i]==n)
                break;
        }
        if(i==n)//查无结果 
            printf("%d\n",0);
        else
            printf("%d\n",i);
    }
    
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值