题目
给你一个正整数,请你判断它是不是3的倍数?
输入格式:
输入数据有一个T(T<=50),代表有T组数据
对于每组数据,一个整数n (1<=n<=10e1000 ) 注意数据范围
输出格式:
对于每组数据,输出一行“YES”或“NO”(不包括引号),代表这个数是或不是3的倍数
输入样例:
在这里给出一组输入。例如:
2
33332
123
输出样例:
在这里给出相应的输出。例如:
NO
YES
代码样例
#include<stdio.h>
#define N 50
int main()
{
char a[N][1000],b;
int n,i,j,s=0;
scanf("%d",&n);
b=getchar();
for(i = 0;i<n;i++)
{
j=-1;
do
{
j++;
scanf("%c",&a[i][j]);
}while(a[i][j]!='\n');
}
for(i=0;i<n;i++)
{
j=s=0;
for(;a[i][j]!='\n';j++)
s=s+(a[i][j]-'0');
if(s%3==0)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
代码分析
1、首先题目中给出的数据范围可以分析得出,若用整形中范围最大的数据类型long long int仍无法正确满足题目中所给数据的要求。所以只能想到使用字符型数组来满足数据输入的要求,从而正确开始解题。
2、根据题目中的输入要求来看,输入的数据中会出现换行符号,因此需要在开始为字符型数组的赋值之前,进行getchar操作,以此来清除首次输入整形数据后的换行符号。
int n,i,j,s=0;
scanf("%d",&n);
b=getchar();
3、由于循环中的判断数据条件是以是否有换行号进行调节,因此在这一部分,选择使用do-while循环来满足先输入后判断,若使用while或者for循环语句,先判断后赋值,则会出现数组默认赋值导致程序不能够满足题目要求和目标效果。
for(i = 0;i<n;i++)
{
j=-1;
do
{
j++;
scanf("%c",&a[i][j]);
}while(a[i][j]!='\n');
}
4、判断一个数据是否能被3整除,则只需判断数据各个位数之和是否为3的倍数,而由于数据类型限制,需要进行一步数据类型转换。需要注意的是:使用字符变量进行计算时,有两种形式。一种为(a[i]-1);此时由字符a的ASCII码参与运算,此种情况极易造成结果与预期不符,若将结果带入数组当中作为数组的下标,则极易出现数组越界。另一种形式为(a[i]-‘1’)由此算出数据a[i]的整形减一的结果。
for(;a[i][j]!='\n';j++)
s=s+(a[i][j]-'0');