原题链接:数字整除
解题思路:
1):按照定理,也就是一个数去掉个位,再减去个位的五倍(判断数)要是17的倍数的话,那原数就是17的倍数,那么减去各位五倍的那个数要是17的倍数的话,还用定理,去掉个位,减去个位的五倍.....这样递归下去,直到到判断数只有三位数的时候,我们用它直接%17看是不是17的倍数,是的话,那么整个原数就是17的倍数;
2):用字符数组记录输入的数;
3):转换为数字存入数组;
4):用另一个数组存放个位数的五倍(只需两位);
5):两数组相减,求判断数,判断数作为新数,(去个位操作:即长度减一)再执行上述操作;
6):因为使用数组存数,相减后,最高位借位后可能为0,把后面的的数一次向前移动,把高位0覆盖;
7):当递归到判断数只有三位数的时,直接%17,判断;
注意事项:
数组的相减,借位,问题,以及高位为0的前移操作;
参考代码:
#include <stdio.h>
#include <string.h>
void panduan( int a[], int len );
void jiewei( int *a );
void zhuanhuan( int *a, char *b );
void duiqi( int *a, int *Len );
int k[10]; /* 用于保存结果*/
int n = 0; /* remember the quantity of consquence */
/*-----------------------------------------------------------------*/
int main()
{
int A[1000];
char b[1000];
char c[] = "0";
scanf( "%s", b );/*输入数据*/
while ( strcmp( b, c ) != 0 )
{
zhuanhuan( A, b );/*把字符转化为数字*/
panduan( A, strlen( b ) );/*开始递归排毒安*/
scanf( "%s", b );
}
for ( int i = 0; i < n; i++ )/*输出结果*/
printf( "%d\n", k[i] );
return(0);
}
/*-----------------------------------------------------------------*/
void panduan( int a[], int len )
{
if ( len <= 3 )/*若果输入的数长度小于3*/
{
int sum = 0;/*直接判断*/
for ( int z = 0; z < len; z++ )
{
sum = sum * 10 + a[z];
}
if ( sum % 17 == 0 )
k[n] = 1;
else
k[n] = 0;
n++;
return;
}
if ( len > 3 )/*如果长度大于3,则继续递归*/
{
int wubeishu[2]; /*存放个位数的五倍*/
int t, i;
t = a[len - 1] * 5; /*t为个位数的五倍,len-1为个位数的位置*/
wubeishu[1] = t % 10;/*存放个位数的5倍之后的数的个位数字*/
wubeishu[0] = t / 10;/*同理存放十位数字*/
i = len - 2; /*判断数的最后一个数字的位置为len-2,因为之前的数的个位移除*/
if ( a[i] - wubeishu[1] < 0 ) /*两数相减,先个位数相减,不够减则借位*/
{
a[i] = a[i] + 10 - wubeishu[1];
jiewei( &a[i - 1] );
}else { a[i] = a[i] - wubeishu[1]; }
if ( a[i - 1] - wubeishu[0] < 0 ) /*两个数十位相减,不够则借位*/
{
a[i - 1] = a[i - 1] + 10 - wubeishu[0];
jiewei( &a[i - 2] );
}else { a[i - 1] = a[i - 1] - wubeishu[0]; }
len = len - 1; /*除去个位后的,现在判断数长度*/
duiqi( &a[0], &len );/*高位对其*/
panduan( a, len );/*递归判断*/
}
return;
}
/*-----------------------------------------------------------------*/
void duiqi( int *a, int *Len )
{
int len1 = (*Len); /*保存起始长度*/
while ( (*a) == 0 )
{
len1--;/*有一个高位为0,则长度减去1*/
for ( int i = 0; i < (*Len); i++ )
{
(*a) = *(a + 1);
a++;
}
}
(*Len) = len1;/*返回高位对其后的长度*/
}
/*-----------------------------------------------------------------*/
void jiewei( int *a )
{
if ( (*a) - 1 < 0 )
{
(*a) = (*a) + 9;
a--;
jiewei( a );
}else {
(*a) = (*a) - 1;
}
return;
}
/*-----------------------------------------------------------------*/
void zhuanhuan( int *a, char *b )
{ while ( (*b) != '\0' )
{
(*a) = (*b) - '0';
a++;
b++;
}
return;
}别忘点赞哦-.-
0.0分
29 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
#include<stdio.h> int main() { long long int n; int count = 0; scanf("%lld", &n); while(count < 10 && n >= 1) { if(n == 0) break; long long int a = 0; a = (n / 10) - 5 * (n % 10); if(a % 17 == 0) { printf("1\n"); } else printf("0\n"); scanf("%lld", &n); count ++; } return 0; } 谁帮我看看我的程序为什么只能得50分?#include<stdio.h> int main() { int a[11]; int i,t; t=1; for(i=0; t!=0; i++) { scanf("%d",&a[i]); t=a[i]; } for(int j=0;j<i-1;j++) { int n,m,s; s=a[j]%10; //个位数的大小 m=(a[j]-s)/10; //去掉个位数的数值 n=m-s*5; //相减的结果 if(n%17==0) printf("1\n"); else printf("0\n"); } return 0; } 为什么我的%50错误啊?求解#include "stdio.h" int pang_duan(int n) { int a; a = n%10; if((n/10 - 5*a)%17 == 0)return 1; else return 0; } void main() { int n,k,j = 0; long int a[10]; while(~(k = scanf("%d",&n))) { if(k != -1)j++; if(n == 0)break; if(j > 10) { break; } a[j-1] = pang_duan(n); } for(int i = 0;i <= j-2;i++) { printf("%d\n",a[i]); } }大佬请帮我看看,我这为什么错误50#include<stdio.h> #include<string.h> #include<stdlib.h> int main() { char num[10][100],p[2]=""; unsigned char len,i,j; for(i=0;i<10;i++) { scanf("%s",num+i); if(*num[i]==0x30) break; } i==11?i=10:0; for(j=0;j<i;j++) { len=strlen(num[j]); len--; p[0]=*(num[j]+len); *(num[j]+len)=0; if((_atoi64(num[j])-_atoi64(p)*5)%17==0) puts("1"); else puts("0"); } return 0; } 为什么会编译出错啊,我自己vscode用的好好的#include<stdio.h> #include<string.h> #include<math.h> int fun(char *str) { char *p = str; int a,b,i,c=0; while(strlen(str)>=10){ while(*p) p++; p--; a = (*p-'0')*5 ; *p = 0 ; b = 0; for(i=0 ; i<2 ; i++){ p--; b += (*p-'0')*pow(10,i); } b -= a; *p = b/10 +'0' ; p++ ; *p= b%10 + '0'; while((*p-'0')<0){ *p += 10; p--; (*p)--; } } p=str; while(*p){ c = c*10 + (*p-'0'); p++; } return c; } 给大家参考下 这个函数是把超长整数转换成与一个计算机可以处理的数,这个数是否是17的倍数 与 超长整数一致(利用题目条件)#include<stdio.h> int main() { int x = 0; char ch; scanf("%c", &ch); do { while (ch != '\n') { x *= 10; x += ch - '0'; x %= 17; scanf("%c", &ch); } if (x == 0) printf("1\n"); else printf("0\n"); scanf("%c", &ch); x = 0; } while (ch != '0'); return 0;void jiewei( int *a ) { if ( (*a) - 1 < 0 ) { (*a) = (*a) + 9; a--; jiewei( a ); }else { (*a) = (*a) - 1; } return; } 大神可以把这里面的a-- 简单的说明一下吗?引用的地址 向前移动一位吗?