编程判断一个实数(任何位数)是否为0.5的整数倍

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;
}
功能好不好试了才知道。


### 使用Transformer模型进行图像分类的方法 #### 方法概述 为了使Transformer能够应用于图像分类任务,一种有效的方式是将图像分割成固定大小的小块(patches),这些小块被线性映射为向量,并加上位置编码以保留空间信息[^2]。 #### 数据预处理 在准备输入数据的过程中,原始图片会被切分成多个不重叠的patch。假设一张尺寸为\(H \times W\)的RGB图像是要处理的对象,则可以按照设定好的宽度和高度参数来划分该图像。例如,对于分辨率为\(224\times 224\)像素的图像,如果选择每边切成16个部分的话,那么最终会得到\((224/16)^2=196\)个小方格作为单独的特征表示单元。之后,每一个这样的补丁都会通过一个简单的全连接层转换成为维度固定的嵌入向量。 ```python import torch from torchvision import transforms def preprocess_image(image_path, patch_size=16): transform = transforms.Compose([ transforms.Resize(256), transforms.CenterCrop(224), # 假设目标分辨率是224x224 transforms.ToTensor(), ]) image = Image.open(image_path).convert('RGB') tensor = transform(image) patches = [] for i in range(tensor.shape[-2] // patch_size): # 高度方向上的循环 row_patches = [] for j in range(tensor.shape[-1] // patch_size): # 宽度方向上的循环 patch = tensor[:, :, i*patch_size:(i+1)*patch_size, j*patch_size:(j+1)*patch_size].flatten() row_patches.append(patch) patches.extend(row_patches) return torch.stack(patches) ``` #### 构建Transformer架构 构建Vision Transformer (ViT),通常包括以下几个组成部分: - **Patch Embedding Layer**: 将每个图像块转化为低维向量; - **Positional Encoding Layer**: 添加绝对或相对位置信息给上述获得的向量序列; - **Multiple Layers of Self-Attention and Feed Forward Networks**: 多层自注意机制与前馈神经网络交替堆叠而成的核心模块; 最后,在顶层附加一个全局平均池化层(Global Average Pooling)以及一个多类别Softmax回归器用于预测类标签。 ```python class VisionTransformer(nn.Module): def __init__(self, num_classes=1000, embed_dim=768, depth=12, num_heads=12, mlp_ratio=4., qkv_bias=False, drop_rate=0.): super().__init__() self.patch_embed = PatchEmbed(embed_dim=embed_dim) self.pos_embed = nn.Parameter(torch.zeros(1, self.patch_embed.num_patches + 1, embed_dim)) self.cls_token = nn.Parameter(torch.zeros(1, 1, embed_dim)) dpr = [drop_rate for _ in range(depth)] self.blocks = nn.Sequential(*[ Block( dim=embed_dim, num_heads=num_heads, mlp_ratio=mlp_ratio, qkv_bias=qkv_bias, drop=dpr[i], ) for i in range(depth)]) self.norm = nn.LayerNorm(embed_dim) self.head = nn.Linear(embed_dim, num_classes) def forward(self, x): B = x.shape[0] cls_tokens = self.cls_token.expand(B, -1, -1) x = self.patch_embed(x) x = torch.cat((cls_tokens, x), dim=1) x += self.pos_embed x = self.blocks(x) x = self.norm(x) return self.head(x[:, 0]) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值