解题思路:思路就是题里的思路,一直减,然后除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语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:593 |
1009题解浏览:802 |
幸运数 (C++代码)浏览:1309 |
淘淘的名单 (C语言代码)浏览:1309 |
C语言程序设计教程(第三版)课后习题7.2 (C语言代码)浏览:812 |
【魔板】 (C++代码)浏览:1236 |
统计立方数 (C语言代码)浏览:890 |
哥德巴赫曾猜测 (C语言代码)浏览:778 |
C语言程序设计教程(第三版)课后习题5.8 (C语言代码)浏览:672 |
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:456 |