解题思路:
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分
36 人评分
#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错误啊?求解
surge 2023-02-02 21:52:30 |
int有限,为小于2^31-1,题目要求为2^100
#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用的好好的
panduan()递归调用,假设数字字符串很长,每次递归,都重复做一次掐尾,减尾*5,,,最终使得字符长度低于3,再转换成数字求模判断,这样反复的掐尾行为,测试了,居然是可以的,这脑洞。。。。。
#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的倍数 与 超长整数一致(利用题目条件)
prettyboy 2019-07-26 10:49:35 |
主函数省略了
#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-- 简单的说明一下吗?引用的地址 向前移动一位吗?