题目描述:
定理:把一个至少两位的正整数的个位数字去掉,再从余下的数中减去个位数的5倍。当且仅当差是17的倍数时,原数也是17的倍数 。
例如,34是17的倍数,因为3-20=-17是17的倍数;201不是17的倍数,因为20-5=15不是17的倍数。输入一个正整数n,你的任务是判断它是否是17的倍数。
输入:
输入文件最多包含10组测试数据,每个数据占一行,仅包含一个正整数n(1<=n<=10^100),表示待判断的正整数。n=0表示输入结束,你的程序不应当处理这一行。
在这里可能有很多人就意识到要用数组来给输入定义,即定义int a[10]给输入定义数据类型且输入10个数据。但我在这里是想说:如果用int类型数组来输入是不够的,会导致溢出,我们可以看到n的范围是10的100次方,也就是说明了这道题必须用字符处理,不然即使逻辑上正确,但最终还是会报错。
char s[102];//最多10^100(101位)
或者
string s;
两个定义方式都是可以通过n的范围条件。
在这里我想引用之前想了很久没有找出错误的例子:
#include <stdio.h>
void fun(int x);
int main()
{
int a[10], i=0,j;
do{
scanf("%d",&a[i++]);
}
while(a[i-1]!=0 && i<10); //输入数据
if(a[i-1]==0) //确定非0数据的个数
j=i-1; //存在0
else // 不存在0
j=i; //j是最终需要处理的数据个数
for(i=0;i<j;i++)
fun(a[i]);
return 0;
}
void fun(int x){ //判断该数据是否为17的倍数
int a=0,i,j;
if(x%17==0){
i=x%10;
x=x/10;
j=x-5*i;
if(j%17==0)
a=1;
}
printf("%d\n",a);
}
这段上面的逻辑没有错误,但平台仍然报错就是因为当时定义的是int a[10]
根本无法满足n的范围要求,就算用字符形式存数,然后处理的时候转换成整数,同样的数,还得溢出。
正确例子:
#include<stdio.h>
int main(){
char s[102];//最多10^100(101位)
while(scanf("%s",s)==1&&!(s[0] == '0'&& s[1]=='\0')){//scanf()输入字符数组,必须在前
int r = 0;
for(int i = 0; s[i]!='\0';i++) r= (r*10+s[i]-'0')%17;//(a+b)%c = a%4+b%4,和的余数等于加数的余数和
printf("%d\n",r==0);//余数是否为0
}
return 0;
}
#include <iostream>
#include <string>
using namespace std;
int main ()
{
string s;
while(cin>>s){
if(s.at(0)=='0') break;
int sum=0,len=s.length();
for(int i=0;i<len;i++){
sum=sum*10+s[i]-'0';
sum%=17;
}
if(sum) cout<<0<<endl;
else cout<<1<<endl;
}
return 0;
}
C++的写法来源
这一段是引用别人的代码,并不是我写出来的,这里只是做个例子。
愿这段扫盲能帮到做算法的同学们。