原题链接:数字整除
解题思路:思路就是题里的思路,一直减,然后除17
我就是直接模拟题里的要求,尽管会很麻烦,但是我觉得还是挺好的
注意事项:
参考代码:
#include<stdio.h>
#include<string.h>
/*
这个题的意思应该是判断一个数是不是17的倍数,但是这个数会很大,所以题目里给了方法,
就是这个数减去自己的个位数,因为一个数是17的倍数,然后这个数(没了个位)减去个位数乘5,
要是也是17的倍数,那么原先的数也是17的倍数
*/
char shu[20][120] = { '\0' };
int result[20] = { 0 };
void Fun(char* shu, int i);
int Pan(char* shu);
int main()
{
int n = 0;
int f = 0;
int i = 0;
int j = 0;
f = scanf("%s", shu[i]);
f = getchar();
while (shu[i][0] != '0')
{
i++;
f = scanf("%s", shu[i]);
f = getchar();
}
n = i;
for (i = 0; i < n; i++)
{
result[i] = Pan(shu[i]);
}
for (i = 0; i < n; i++)
{
printf("%d\n", result[i]);
}
return 0;
}
int Pan(char* shu)
{
//不是十位数
while (strlen(shu) > 2)
{
char ge_char = shu[strlen(shu) - 1];//提取个位数
shu[strlen(shu) - 1] = '\0';//把个位去掉
ge_char= ge_char - '0';//变一下
int ge = ge_char;//现在的个位数是整形
int cheng = ge * 5;//乘完5的乘积
//把乘完的结果的个位和十位拿出来
char cheng_ge = cheng % 10 + '0';//再把整形转换为字符
char cheng_shi = cheng / 10 + '0';
//判断个位
if (cheng_ge <= shu[strlen(shu) - 1])//个位小于要判断的数的个位,直接减就行
{
shu[strlen(shu) - 1] = shu[strlen(shu) - 1] - cheng_ge + '0';//别忘了加‘0’,再转化为字符型
}
else//否则就要借一
{
/* 507 - 9的情况
*/
if (shu[strlen(shu) - 2] == '0')//就是十位不够借,就再向上借
{
Fun(shu, strlen(shu) - 2);//当前的数组,然后当前不够借的index
//借完了
/*以507-9举例子,就是变成了17-9*/
char c1 = shu[strlen(shu) - 1] - '0';//7
int c2_ = 1;//数字1
int c1_ = c1;//数字7
int he = c2_ * 10 + c1_;//就是17
char c3 = cheng_ge - '0';//就是9
int c3_ = c3;//数字9
int cha = he - c3_;//相当于17-9 ,cha等于8
char cha_ = cha + '0';//字符8
shu[strlen(shu) - 1] = cha_;//把减完的字符再放数组里
}
else//十位够借
{
shu[strlen(shu) - 2] = shu[strlen(shu) - 2] - 1 ;//十位已经减去一了
char c1 = shu[strlen(shu) - 1] - '0';//7
int c2_ = 1;
int c1_ = c1;
int he = c2_ * 10 + c1_;
char c3 = cheng_ge - '0';
int c3_ = c3;
int cha = he - c3_;
char cha_ = cha + '0';
shu[strlen(shu) - 1] = cha_;
}
}
//判断十位
if (cheng_shi <= shu[strlen(shu) - 2])//十位小于要判断的数的十位,直接减就行
{
shu[strlen(shu) - 2] = shu[strlen(shu) - 2] - cheng_shi + '0';//别忘了加‘0’,再转化为字符型
}
else//否则就要借一
{
if (shu[strlen(shu) - 3] == '0')//就是百位不够借,就再向上借
{
Fun(shu, strlen(shu) - 3);//当前的数组,然后当前不够借的index
//借完了
/*以5070-90举例子,就是变成了170-90*///后面的0就可以忽略了
char c1 = shu[strlen(shu) - 2] - '0';//7
int c2_ = 1;//数字1
int c1_ = c1;//数字7
int he = c2_ * 10 + c1_;//就是17
char c3 = cheng_shi - '0';//就是9
int c3_ = c3;//数字9
int cha = he - c3_;//相当于17-9 ,cha等于8
char cha_ = cha + '0';//字符8
shu[strlen(shu) - 2] = cha_;//把减完的字符再放数组里
}
else//十位够借
{
shu[strlen(shu) - 3] = shu[strlen(shu) - 3] - 1 ;//十位已经减去一了
char c1 = shu[strlen(shu) - 2] - '0';//7
int c2_ = 1;
int c1_ = c1;
int he = c2_ * 10 + c1_;
char c3 = cheng_shi - '0';
int c3_ = c3;
int cha = he - c3_;
char cha_ = cha + '0';
shu[strlen(shu) - 2] = cha_;
}
}
//已经减完了
}
if (strlen(shu) <= 2)//要是数组里的字符个数小于等于2,就是一个十位数,可以直接进行判断
{
int sum = 0;
sum += (shu[0] - '0') * 10;
sum += (shu[1] - '0') * 1;
if (sum % 17 == 0)
{
return 1;
}
else
{
return 0;
}
}
}
void Fun(char* shu,int i)//十位不够,再往上借,所以现在shu[i]就代表要借的那个位
{
if (shu[i] == '0')//要是传进来的那个数是0,就要往上一位去借
{
Fun(shu, i - 1);
shu[i] = '9';
}
//直到够借了为止
else
{
shu[i] = shu[i] - 1;
}
} 0.0分
3 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复