问题 1074: 数字整除的盲点清扫

题目描述
定理:把一个至少两位的正整数的个位数字去掉,再从余下的数中减去个位数的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++的写法来源
这一段是引用别人的代码,并不是我写出来的,这里只是做个例子。
愿这段扫盲能帮到做算法的同学们。

发布了9 篇原创文章 · 获赞 18 · 访问量 1576

猜你喜欢

转载自blog.csdn.net/weixin_45677047/article/details/104447821