2020.03.08测试题1

题目

给你一个正整数,请你判断它是不是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');	
发布了19 篇原创文章 · 获赞 0 · 访问量 463

猜你喜欢

转载自blog.csdn.net/zzu957/article/details/104748565