0.5的整数倍
Time Limit: 1000MS | Memory Limit: 100K | |
Total Submissions: 1 | Accepted: 1 |
Description
输入一个实数 判断是否为0.5的整数倍
Input
输入一个整数N(1<=N<=1000) 表示输入N个数
第二行开始 输入个数 算上小数点最多1000位 共N行
Output
如果此数为0.5的整数倍则输出Yes 否则输出No
Sample Input
3
0.500000000000000000000000000000000000000000000001
-12.50000000000000000000000000000000000000000
+123456879897987789987.0
Sample Output
No
Yes
Yes
个人理解:
用简单的扩大缩小 会导致数据不准确
因此用 字符串比较合适
但是字符串虽然让位数没了限制 但是 如果用户输入的不是数字
或者 有 + - .5 . 0. 0.500000 .0000000 .50000000 等情况都需要考虑到
代码C语言:
# include <stdio.h>
int gainchar(char *a,int max);//对*a输入范围[1,max]返回 小数点的位置 如果没有小数点 返回0
int GET(char S[],int A);//S为字符串 A为小数点的位置 是0.5整数倍返回1 否则返回0
# define N 1001 //录入N位数
char A[N+1];
int main()
{
int n,F;
char B[][4]={"No","Yes"};
scanf("%d",&n);
while(n--)
{
F=GET(A,gainchar(A,N));
puts(B[F]);
}
return 0;
}
int GET(char S[],int A)//S为字符串 A为小数点的位置 是0.5整数倍返回1 否则返回0
{
int C=-1;
while(S[++C]); //C=B的长度
if(!A||A==C)return 1;//如果小数点没有或者在最后的位置
if(S[A]=='5'||S[A]=='0')//如果小数点后面是'5'或者'0'
{
while(A<C&&S[A+1]=='0')A++;//继续比较是不是'0'
return A>=C-1;//如果比较最后A>=C-1则比较完毕都符合题意
}
return 0;//如果上述都不行 返回0
}
int gainchar(char *a,int max)//对*a输入范围[1,max]
{
int B,c,Flag,i,j,k,S;
do{
j=i=-1;
k=Flag=i=0;
do
{
a[max]=B=c=0;
while((a[c++]=getchar())!='\n'&&c<max);
if(a[c-1]!='\n')
while(getchar()!='\n'&&++B);
else a[--c]=0;
if(B||c&&c<1)
printf("您录入的字符串长度:%d字节\n只录入(1--%d)个字节!\n",B+c,max);
}while(B||c>max||c<1);
while(++i<c){
if((a[i]>'9'||a[i]<'0'))
{
if(a[i]=='.')
{
k++; //k记录小数点个数
j=i;
}
else if(!i&&(a[0]=='-'||a[0]=='+'));
else
{
Flag++;
break;
}
}
}
if(Flag||k>1) printf("输入的数字不合法!"); //当小数点多于1个或者有的不是数字时
}while(Flag||k>1);
return j+1; //返回下标
}
下面的的代码 是完善输入输出的:
# include <stdio.h>
/*判断任何一个数是否为0.5的整数倍 zhagoodwell*/
int gainchar(char *a,int max);//输入数字 保存在a里 并返回 小数点的位置 如果没有小数点 返回0
# define N 1001 //想录入X位数 包括+-号和小数点 就将其改为 X+1
int main(){
char B[N];
int A,C;
do{
C=-1;
A=gainchar(B,N); //A储存小数点下标 非数组下标
while(B[++C]); //C=B的长度
if(!A||A==C)
printf("YES!\n");
else if(B[A]=='5'||B[A]=='0')
{
while(A<C&&B[A+1]=='0')
A++;
printf("%s!\n",A>=C-1?"YES":"NO");
}
else
printf("NO!\n");
}while(C);
return 0;
}
int gainchar(char *a,int max)//对*a输入范围(min,max),如果字符数组中存在'\n',将其改为'\0'
{
int c,Flag,i,j,k,S;
do{
printf("输入数字(1--%d位):\n",max-1);
do{
j=c=-1; //初始化数据
k=Flag=i=S=0;
fgets(a,max,stdin);
while(a[++c]);
c=a[c-1]=='\n'&&c<max?c-1:c;
if(c>=max-1)
while(getchar()!='\n')
S++; //输出的位数多于N-1时会除去多余的
else
a[c]='\0';
if(S||c&&(c>max||c<1))//如果用户只输入'\n'则不提示输入错误,否则提示错误
printf("输入长度有误,请重新输入!\n注:(1--%d)位:\n",max-1);
}while(S||c>max||c<1);
while(i<c)
{
if((a[i]>'9'||a[i]<'0'))
{
if(a[i]=='.')
{
k++; //k记录小数点个数
j=i;
}
else if(!i&&(a[0]=='-'||a[0]=='+'));
else{
Flag++;
break;
}
}
i++;
}
if(Flag||k>1) //当小数点多于1个或者有的不是数字时
printf("输入的数字不合法!");
}while(Flag||k>1);
return j+1; //返回下标
}
附加小代码判断字符串是否为汉字:
可能有人会说很简单,因为C语言中汉字的ASCLL码都是负的,但是 如果用户输入的是中文标点符号 那么单纯的依靠正负是不行的
# include <stdio.h>
# define N 13
int Chinese(char *a,int min,int max); //min为偶数 max一定要为奇数
int main(){
char a[2][N];
printf("%d字节—%s\n",Chinese(a[0],2,13),a[0]);
printf("%d字节—%s",Chinese(a[1],2,13),a[1]);
}
int Chinese(char *a,int min,int max)
{
int c,i,j,k,p;
char key[23][3]={"。","】","【","!","…","?","《","》",",","{","}","(",")","¥","‘","’",":",";","—","”","“","、","·"};
printf("注:一个汉字两个字节\n");
do{
printf("输入(%d--%d)个汉字:多余的汉字将自动清除:\n",min/2,max/2);
do{
c=i=-1;
fgets(a,max,stdin);
while(a[++c]);
c=(a[c-1]=='\n')&&c<max?c-1:c;
if(c>=max-1)
while(getchar()!='\n');
else
a[c]='\0';
if(c&&(c>max||c<min))
printf("输入的汉字个数不合法!请重新输入:\n");
}while(c>max||c<min);
while(a[++i]<0&&i<c);
if(i-c)
p=0;
else
for(k=j=i=0,p=1;p&&k<23;i=j=0,k++)
{
while(i<c&&j<2)
if (a[i]==key[k][j])
{
++i;++j;
}
else
{
i-=j-1;
j=0;
}
if(j==2&&!(i%2))
p=0;
}
if(!p)
printf("您的输入中有的不是汉字!\n请重新");
}while(!p);
return c;
}
功能好不好试了才知道。