2010湖南省赛C 数字整除(两种思路)

简介: 2010湖南省赛C 数字整除(两种思路)



前言


本来很简单一个题被我用复杂的方法做了浪费了太多时间


题目描述:


定理:把一个至少两位的正整数的个位数字去掉,再从余下的数中减去个位数的5倍。当且仅当差是17的倍数时,原数也是17的倍数 。


例如,34是17的倍数,因为3-20=-17是17的倍数;201不是17的倍数,因为20-5=15不是17的倍数。输入一个正整数n,你的任务是判断它是否是17的倍数。

输入:

输入文件最多包含10组测试数据,每个数据占一行,仅包含一个正整数n(1≤n≤10100),表示待判断的正整数。n=0表示输入结束,你的程序不应当处理这一行。

输出:

对于每组测试数据,输出一行,表示相应的n是否是17的倍数。1表示是,0表示否。


思路:


其实就是一个简单的高精除,根本用不到定理,但是我一开始费了好的力去模拟定理,虽然最后过了,但是浪费了太多时间:


高精除代码:


#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
typedef long long ll;
const ll maxx = 1e18;
const int N = 1e6+100;
const int p = 1e4;
const double eps = 1e-8;
string s;
int len,k;
int main()
{
  while(cin>>s)
  {
  if(s=="0") return 0;
  len=s.size();k=0;//注意每组数据把 k 清零
  for(int i=0;i<len;i++)
  {
    k=k*10+(s[i]-'0');
    if(k>=17) k%=17;
  }//模拟高精除
  if(k==0) cout<<"1"<<endl;
  else cout<<"0"<<endl;//判断余数
  }
}


这里也给出我花了半小时敲出来的模拟代码:

思路:

两部分 1.尾数×5 为 s1串 2. 给出数数减去位数 为 s2串


如果 s1 >= s2

把这两个串变成数然后相减取绝对值


如果 s1 < s2

先模拟高精减,然后模拟高精除


#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
typedef long long ll;
const ll maxx = 1e18;
const int N = 1e6+100;
const int p = 1e4;
const double eps = 1e-8;
string s;
int a[110];
int b[3];
int len,k;
int main()
{
  while(cin>>s)
  {
  if(s=="0") return 0;
  len=s.size();
  for(int i=1;i<len;i++) a[i]=s[len-i-1]-'0';// s1部分读到 a数组里
//  for(int i=len-1;i>=1;i--) cout<<a[i];
//  cout<<endl;//debug
  int k=(s[len-1]-'0')*5;
//  cout<<k;
  int ii=1;
  while(k)
  {
    b[ii]=k%10;
    k/=10;
    ii++; 
  }
  ii--;// s2部分读到 b 数组里
//  for(int i=len-1;i>=1;i--) cout<<a[i];//debug
  if(len-1>ii)//情况二
  {
    int m=1,n=1;//m小 n大 
    while(m<=ii&&n<=len-1)
    {
    if(a[n]<b[m])
    {
      a[n]=a[n]+10-b[m];
      int k=n;
      while(a[k+1]==0)
      {
      k++;
      }
//      cout<<k+1<<endl;
      a[k+1]--; 
    }
    else
    a[n]=a[n]-b[m];
    m++;n++;
    }//高精减
    ;
//    for(int i=len-1;i>=1;i--) cout<<a[i];
//    cout<<endl; //debug
    int kks=0;
    for(int i=len-1;i>=1;i--)
    {
    kks=kks*10+a[i];
    if(kks>=17)  kks%=17;
    }//高精除
    if(kks==0) cout<<"1"<<endl;
    else cout<<"0"<<endl;//看余数
  }
  else if(len-1<=ii)//情况一
  {
    ll ks=0;
    for(int i=0;i<len-1;i++)
    {
    ks=ks*10+s[i]-'0';
    }
    ll kk=(s[len-1]-'0')*5;
    if((kk-ks)%17==0) cout<<"1"<<endl;
    else cout<<"0"<<endl;
  }
  } 
}


总结:


认真读题思考很重要,不要被题带偏了。


目录
相关文章
|
6月前
数字游戏2(数位dp)
数字游戏2(数位dp)
39 0
|
4月前
【洛谷】P8707 [蓝桥杯 2020 省 AB1] 走方格
dp[1][j]=dp[i][1]=0 (因为每次只能向右或向下走,所以如果从(1,1)到第一行上所有的点的方案,只有水平向右走这一种。题目大意:现在有个人站在第 1 行第 1 列,要走到第 i 行第 j 列(每次只能向右或者向下走),如果行号和列号都是偶数,不能走入这一格中。因为不能走入行号和列号均为偶数的格子,所以当行号和列号均为偶数(也就是i%2==0&&j%2==0)时,dp[i][j]=0。因为我们已经考虑过了从(1,1)到第一行或者到第一列的情况,所以循环枚举时我们从(2,2)开始。
60 11
|
5月前
|
机器学习/深度学习
【Acwing积累】第一周(完全数、只出现一次的字符)
【Acwing积累】第一周(完全数、只出现一次的字符)
|
6月前
|
测试技术
[蓝桥杯 2020 省 B1] 整除序列
[蓝桥杯 2020 省 B1] 整除序列
49 0
|
6月前
|
存储 人工智能 算法
大数乘法的几种算法分析及比较(2014腾讯南京笔试题)
大数乘法的几种算法分析及比较(2014腾讯南京笔试题)
|
6月前
|
算法
第十四届蓝桥杯集训——for——判断质数/素数
第十四届蓝桥杯集训——for——判断质数/素数
57 0
|
算法
山东第一届省赛 Greatest Number(优雅暴力+二分)
山东第一届省赛 Greatest Number(优雅暴力+二分)
71 1
|
测试技术
洛谷P8601[蓝桥杯][2013年第四届真题]剪格子
洛谷P8601[蓝桥杯][2013年第四届真题]剪格子
78 0
题目 2571: 蓝桥杯2020年第十一届省赛真题-回文日期
题目 2571: 蓝桥杯2020年第十一届省赛真题-回文日期
【蓝桥杯基础题】2017年省赛—九宫幻方
【蓝桥杯基础题】2017年省赛—九宫幻方
【蓝桥杯基础题】2017年省赛—九宫幻方