解题思路:  /*******按照除法规则递归调用即可,不是很需要题目给出的运算方法***********/


参考代码:

<First>/********************按照除法顺序********************************/
AC代码:
#include <iostream>
#include<string>
#include<cmath>
#define N 1000
using namespace std;
bool is_17x(int *arr,int begin,int end);
int main()
{
    string str;
    while(getline(cin,str))
    {
        int num[N];
        for(int i=0;i<str.size();++i)
        num[i]=str.at(i)-'0';
        if(num[0]==0) break;
        if(is_17x(num,0,str.size()-1)) cout<<1<<endl;
        else cout<<0<<endl;
    }
    return 0;
}
bool is_17x(int *arr,int begin,int end)
{
    if(end-begin==1) return !((arr[end]+arr[begin]*10)%17);
    arr[begin+1]=(arr[begin]*10+arr[begin+1])%17;
    return is_17x(arr,begin+1,end);
}
<Second>/************(按照题目意思)内存超限版本(反正都写了就记录一下-_-)*************/
#include <iostream>
#include<string>
#include<cmath>
#define N 1000
using namespace std;
bool is_17x(int *arr,int begin,int end);
int main()
{
    string str;
    while(getline(cin,str))
    {
        int num[N];
        for(int i=0;i<str.size();++i)
        num[i]=str.at(i)-'0';
        if(num[0]==0) break;
        if(is_17x(num,0,str.size()-1)) cout<<1<<endl;
        else cout<<0<<endl;
    }
    return 0;
}
bool is_17x(int *arr,int begin,int end)
{
      if(begin-end==-1)
      {
          int temp=arr[begin]*10+arr[end];
          if(temp%17==0) return true;
          else return false;
      }
      int _n=5*arr[end]/10,n_=5*arr[end]%10;
      int flag[end+1];//借位标志符
      for(int i=begin;i<=end;++i)
      flag[i]=0;
      if(arr[end]<n_) flag[end]=1; //个位不够减需要借位
      arr[end]=abs(arr[end]-n_);
      if(flag[end]==1)//个位不够减需要借位
      {
         if(arr[end-1]-1-_n<0) flag[end-1]=1; //十位不够减需要借位
         arr[end-1]=abs(arr[end-1]-1-_n);
      }
      if(flag[end]==0)//个位够减不需要借位
      {
         if(arr[end-1]-_n<0) flag[end-1]=1; //十位不够减需要借位
         arr[end-1]=abs(arr[end-1]-_n);
      }
      for(int i=end-2;i>=begin;--i)
      {
        if(flag[i+1])//有借位才需要处理
        {
        if(arr[i]>0) {--arr[i];break;}
        if(arr[i]==0) {arr[i]=9;flag[i]=1;}
        }
      }
      if(flag[begin]) ++begin;//如果最高位都需要借位,那么下次迭代将最高位去除
      return is_17x(arr,begin,end);
}


点赞(1)
 

0.0分

0 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论