| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2646 人关注过本帖
标题:今天做oj碰到这道题,17的倍数,参考了一下网上的解题方法还是通不过,求指 ...
只看楼主 加入收藏
随手十五字
Rank: 1
来 自:毛里求斯
等 级:新手上路
帖 子:5
专家分:0
注 册:2015-6-9
收藏
 问题点数:0 回复次数:6 
今天做oj碰到这道题,17的倍数,参考了一下网上的解题方法还是通不过,求指导
题目描述
 

 定理:把一个至少两位的正整数的个位数字去掉,再从余下的数中减去个位数的5倍。当且仅当差是17的倍数时,原数也是17的倍数 。
例如,34是17的倍数,因为3-20=-17是17的倍数;201不是17的倍数,因为20-5=15不是17的倍数。输入一个正整数n,你的任务是判断它是否是17的倍数。
输入
输入文件最多包含10组测试数据,每个数据占一行,仅包含一个正整数n(1<=n<=10^100),表示待判断的正整数。n=0表示输入结束,你的程序不应当处理这一行。
输出
对于每组测试数据,输出一行,表示相应的n是否是17的倍数。1表示是,0表示否。

样例输入
34
201
2098765413
1717171717171717171717171717171717171717171717171718
0
样例输出
1
0
1
0

#include<stdio.h>
#include<string.h>
int main()
{
    char str[1001];
    int t,a,b,c,d,e,i;
    while(gets(str)!=NULL)
    {
        if(str[0]=='0') return 0;
        t=strlen(str);
        while(t>3)
        {
            d=(str[t-1]-'0')*5;
            c=(str[t-2]-'0');
            b=(str[t-3]-'0')*10;
            a=(str[t-4]-'0')*100;
            e=a+b+c-d;
            str[t-2]=e%10+'0';
            str[t-3]=e/10%10+'0';
            str[t-4]=e/100+'0';
            t--;
        }
        for(e=0,i=0;i<=t-1;i++)
        {
            e=e*10;
            e=e+(str[i]-'0');
        }
        if(e%17==0)
        printf("1\n");
        else
        printf("0\n");
    }
    return 0;
}

#include<stdio.h>
int main()
{
    char a[1001];
    int n,b[1001],i,j,e;
    while(gets(a)!=NULL)
    {
        if(a[0]=='0') return 0;
        for(i=0,n=0;a[i]!='\0';i++)
        {
            b[i]=a[i]-'0';n++;
        }
        j=b[0];
        for(i=1;i<n;i++)
        {
            e=j*10+b[i];j=e%17;
        }
        if(j==0) printf("1\n");
        else printf("0\n");
    }
    return 0;
}
希望各位能给我讲讲哪里出问题了,谢谢0.0
搜索更多相关主题的帖子: 正整数 网上 
2015-06-09 22:58
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 
原题的算法太慢,可以作弊一下,形如
1717171717171717171717171717171717171717171717171718
从左到右不停的模除17,余数保留作为新的头,最后有剩余则不是17的倍数
2015-06-10 10:36
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 
“通不过”是什么意思呀,为什么不愿意将问题描述清楚?

你这里有两段代码,那我问你:
a. 哪段代码是你的,哪段是别人的?或者说 你需要别人替你查哪段代码的错误?
b. 你提交的是哪段代码?抑或是两段代码同时提交上去了?
c. 你提交代码后,OJ告诉你是编译链接错误呢,还是测试不能通过?


2015-06-10 10:49
随手十五字
Rank: 1
来 自:毛里求斯
等 级:新手上路
帖 子:5
专家分:0
注 册:2015-6-9
收藏
得分:0 
首先感谢帮忙,两个都提交了都是答案错误,第二个代码的思路是根据模拟除法做的,还是错了
这是oj给的
=================/1003.out
Right:
1

-----------------
Your:
0

=================
辅助解释:

/**************************************************************
    Problem: 1003
    User: 1405030212
    Language: C
    Result: 答案错误
****************************************************************/

Hello world!
2015-06-10 17:27
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 
看不出有什么问题,看来看去,只有题目中的“n=0表示输入结束”你用的是“if(a[0]=='0') return 0;”,不怎么符合题目要求。

我改一下吧
程序代码:
#include <stdio.h>

int main( void )
{
    // tip: 10^100需要101个字符,加上'\0',所以共需102
    //      gets已经被C语言废弃,所以我用scanf

    for( char s[102]; scanf("%s",s)==1 && !(s[0]=='0' && s[1]=='\0'); )
    {
        unsigned r = 0;
        for( size_t i=0; s[i]!='\0'; ++i )
            r = (r*10+s[i]-'0')%17;

        printf( "%d\n", r==0 );
    }

    return 0;
}

2015-06-11 09:08
随手十五字
Rank: 1
来 自:毛里求斯
等 级:新手上路
帖 子:5
专家分:0
注 册:2015-6-9
收藏
得分:0 
十分感谢,我把gets改成scanf过了!!

Hello world!
2015-06-12 16:39
qq291221550
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2016-11-14
收藏
得分:0 
程序代码:
/*
定理:
把一个至少两位的正整数的个位数字去掉,
再从余下的数中减去个位数的5倍。
当且仅当差是17的倍数时,原数也是17的倍数 。
例如,
34是17的倍数,因为3-20=-17是17的倍数;
201不是17的倍数,因为20-5=15不是17的倍数。
输入一个正整数n,你的任务是判断它是否是17的倍数。
输入
输入文件最多包含10组测试数据,
每个数据占一行,仅包含一个正整数n(1<=n<=10^100),
表示待判断的正整数。
n=0表示输入结束,你的程序不应当处理这一行。
输出
对于每组测试数据,输出一行,表示相应的n是否是17的倍数。1表示是,0表示否。
样例输入
34
201
2098765413
1717171717171717171717171717171717171717171717171718
0
样例输出
1
0
1
0

我的分析:
34=                                   1
3-4*5=-17                             1


201=                                  0
20-5=15                               0
1-25=-24                              0

2098765413=                           1
209876541-15=209876526                1
20987652-30=20987622                  1
2098762-10=2098752                    1
209875-10=209865                      1
20986-25=20961                        1
2096-5=2091                           1
209-5=204                             1
20-20=0                               1
               

*/

#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
int shiqi(char a[])
{
    int n,m,x,t,mop,p;
    n=strlen(a);
    if(n>2)  //长度大于1  就是2位数以上

    {
        n=n-1;
        //我提取 最小的一位数字 并把他乘5

        m=a[n]-'0';
        m=m*5;
        //我也要适当 提取 后面的数字
        p=1;
        x=0;
        t=1; //这个用于记录我提取了几位

        while(fabs(x)<=fabs(m))
        {
            x=x+p*(a[n-t]-'0');
            p=p*10;
            if(n-t==0) break;
            t++;
        }
        t--;
        //现在好了 我算下 后t位的 相剪的数字
        x=x-m;  //x是最后的几位(t位)
        //一共提取了t位
        // x=123  t=3  我要提取 1    x/100=1   x=x%100 =23
        // x=23   t=2  我要提取 2    x/10 =2   x=x%10 =3
        // x=3    t=1  我要提取 3    x/1
        //x
        int xx;
        if(n==2) t++;
        mop=pow(10,t-1);
        for(xx=n-t;t>0;t--,xx++)
        {
            if(mop==0) mop=1;
            a[xx]=x/mop+'0';
            x=x%mop;
            mop=mop/10;
        }
        a[n]=0;
        return shiqi(a);
    }
    else
    {
        x=0;
        x=(a[0]-'0')*10+(a[1]-'0');
        return x;
    }
}
int main(){
    char a[10][110]={0};
    int i,j;
    for(i=0;i<10;i++)
    {
        gets(a[i]);
        if(strcmp(a[i],"0")==0) break;
    }
    for(j=0;j<i;j++)
    {
        if(shiqi(a[j])%17==0) cout<<1<<endl;
        else cout<<0<<endl; 

    }
    return 0;
}
2016-11-14 15:50
快速回复:今天做oj碰到这道题,17的倍数,参考了一下网上的解题方法还是通不过, ...
数据加载中...
 
   



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

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