题目来源https://blog.csdn.net/wgx571859177/article/details/79678656
1.数字处理
题目描述:给出一个不多于5位的整数,进行反序处理,要求
(1)求出它是几位数
(2)分别输出每一个数字(空格隔开)
(3)按逆序输出各位数字(仅数字间以空格间隔,负号与数字之间不需要间隔)
输入描述:位数不大于5的整数
输出描述:1.整数位数 2.空格间隔输出结果 3.逆序整数
#include<stdio.h>
#include<string.h>
char k[7];
int weishu,i,l,f,ff;
void main()
{
while(scanf("%s",&k)!=EOF)
{
l=strlen(k);
f=0; //标记正负号,正数为0,负数为1
if(k[0]=='-')
{
f=1;
for(i=1;i<l;i++)
k[i-1]=k[i];
k[l-1]='\0';
l--;
}
weishu=l;
for(i=0;i<l;i++)
{
if(k[i]=='0')
weishu--;
else
break;
}
printf("总位数:%d\n",weishu);
//分别输出每一个数字
printf("每一个数字:");
for(i=0;i<l;i++)
printf(" %c",k[i]);
printf("\n");
//按逆序输出每一个数字
printf("逆序输出每一个数字:");
if(f)
{
printf("-");
}
for(i=l-1;i>0;i--)
printf("%c ",k[i]);
printf("%c\n",k[0]);
}
}
用时40min???我也太慢了吧。。。。
主要读题目的有时候有点点曲解他的意思,还有想太多,所以以后在读题目的时候一定要谨慎。
2.输入四个IP端,前两个为第一个IP段的起始和终止地址,后两个是第二个IP段的起始和终止地址,判断这两个IP段是否存在交集
输入描述:输入4个IP
输出描述:如果存在交集,输出 Overlap IP ; 如果不存在交集,输出 No Overlap IP
#include<stdio.h>
int add[5][5],i,j;
char d;
void swap(int *a,int *b)
{
int temp;
temp=*a;
*a=*b;
*b=temp;
}
void main()
{
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
scanf("%d",&add[i][j]);
if(j!=3)
scanf("%c",&d);
}
}
//保证存在add[0]中的起始地址比存在add[3]中的小
for(i=0;add[0][i]==add[2][i];i++);
if(add[0][i]>add[2][i])
{
for(j=0;j<4;j++)
{
swap(&add[0][j],&add[2][j]);
swap(&add[1][j],&add[3][j]);
}
}
for(i=0;add[1][i]==add[2][i];i++);
if(add[1][i]<add[2][i])
printf("No Overlap IP\n");
else
printf("Overlap IP\n");
}
用时45min
我看到网上大势似乎是把ip地址转化成二进制,然后判断,我寻思我这应该也没错吧。。
3
题目
给定字符串内有很多正整数,要求对这些正整数进行排序,然后返回排序后指定位置的正整数
排序要求:按照每个正整数的后三位数字组成的整数进行从小到大排序
1)如果不足三位,则按照实际位数组成的整数进行比较
2)如果相等,则按照输入字符串中的原始顺序排序
说明(以下内容考生无须检查,调用者保证):
1) 字符串以’\0’结尾,仅包含数字、空格
2) 字符串内正整数之间以单个空格分隔,字符串首尾没有空格
3) 正整数格式为十进制,大小:1~1000000,正整数的数字非零开始
示例:
如字符串内容
1223 22 3232 2016
按照规定排序后
2016 22 1223 3232
查询排序后的第3个数是
1223
#include<stdio.h>
#include<string.h>
int ten(int n)
{
int res=1;
for(int i=0;i<n;i++)
res*=10;
return res;
}
void swap(int *a,int *b)
{
int temp;
temp=*a;
*a=*b;
*b=temp;
}
void main()
{
char str[1000000];
char s[8];
int l,i,j,k,cnt,n,num[100000][2];
while(gets(str))
{
scanf("%d",&n);
memset(num,0,sizeof(num));
l=strlen(str);
j=0;
cnt=0;
for(i=0;i<l;i++)
{
if(str[i]==' ')
{
for(k=0;k<j;k++)
num[cnt][0]+=(s[k]-'0')*ten(j-k-1);
j=0;
cnt++;
continue;
}
s[j++]=str[i];
}
for(k=0;k<j;k++)
num[cnt][0]+=(s[k]-'0')*ten(j-k-1);
//求出后三位数
for(i=0;i<=cnt;i++)
num[i][1]=num[i][0]%1000;
//按照后三位数升序进行排序
for(i=0;i<=cnt;i++)
{
for(j=0;j<cnt-i;j++)
{
if(num[j][1]>num[j+1][1])
{
swap(&num[j][0],&num[j+1][0]);
swap(&num[j][1],&num[j+1][1]);
}
}
}
printf("按照规定排序后:");
for(i=0;i<cnt;i++)
printf("%d ",num[i][0]);
printf("%d\n",num[cnt][0]);
printf("查询后第%d个数为:",n);
printf("%d\n",num[n-1][0]);
}
}