输入一个32位的IP地址输出为点分十进制C语言编写程序,麻烦大神看看我的程序逻辑上哪里不对
题目:想象一下你正在从输入设备上读入比特流,它表示的是IP地址,你现在的任务是把一个32位长的由'1'和'0'构成的序列转换成一个由'.'分隔成4段的IP地址。即每8位转...
题目:
想象一下你正在从输入设备上读入比特流,它表示的是IP地址,你现在的任务是把一个32位长的由'1'和'0'构成的序列转换成一个由'.'分隔成4段的IP地址。即每8位转换成一个十进制数,总共4段,由'.'分隔
Input
输入数据的第一行是一个正整数n(1<=n<=9),表示总共有n行数据需要你转换。接下来的n行里,每行都是一个32位的由'1'和'0'组成的串。
Output
输出数据是n行,每行是一个由'.'分隔成4段的IP地址。
Sample Input
4
00000000000000000000000000000000
00000011100000001111111111111111
11001011100001001110010110000000
01010000000100000000000000000001
Sample Output
0.0.0.0
3.128.255.255
203.132.229.128
80.16.0.1
我的程序:
#include <stdio.h>
int pow(int m,int n)
{
int i;
int p=1;
for (i = 0;i < n;i++)
{
p=p*m;
}
return p;
}
int main()
{
int i,j,k,number,m,IP8[9][4];
int k1,k2,k3;
scanf("%d",&number);
char IP2[9][32];
for (i = 0;i < number;i++)
{
scanf("%s",&IP2[i]);
}
for (i = 0;i < number;i++)
{
for (j = 0;j < 4;j++)
{
m=0;
k1=0+(8*j);
k2=8+(8*j);
for (k = k1;k < k2;k++)
{
if (IP2[i][k]=='1')
{
k3=k-8*j;
m=m+pow(2,k3);
}
}
IP8[i][j]=m;
}
}
for (i = 0;i < number;i++)
{
for (j = 3;j >= 0;j--)
{
printf("%d.",IP8[i][j]);
}
printf("\n");
}
return 0;
} 展开
想象一下你正在从输入设备上读入比特流,它表示的是IP地址,你现在的任务是把一个32位长的由'1'和'0'构成的序列转换成一个由'.'分隔成4段的IP地址。即每8位转换成一个十进制数,总共4段,由'.'分隔
Input
输入数据的第一行是一个正整数n(1<=n<=9),表示总共有n行数据需要你转换。接下来的n行里,每行都是一个32位的由'1'和'0'组成的串。
Output
输出数据是n行,每行是一个由'.'分隔成4段的IP地址。
Sample Input
4
00000000000000000000000000000000
00000011100000001111111111111111
11001011100001001110010110000000
01010000000100000000000000000001
Sample Output
0.0.0.0
3.128.255.255
203.132.229.128
80.16.0.1
我的程序:
#include <stdio.h>
int pow(int m,int n)
{
int i;
int p=1;
for (i = 0;i < n;i++)
{
p=p*m;
}
return p;
}
int main()
{
int i,j,k,number,m,IP8[9][4];
int k1,k2,k3;
scanf("%d",&number);
char IP2[9][32];
for (i = 0;i < number;i++)
{
scanf("%s",&IP2[i]);
}
for (i = 0;i < number;i++)
{
for (j = 0;j < 4;j++)
{
m=0;
k1=0+(8*j);
k2=8+(8*j);
for (k = k1;k < k2;k++)
{
if (IP2[i][k]=='1')
{
k3=k-8*j;
m=m+pow(2,k3);
}
}
IP8[i][j]=m;
}
}
for (i = 0;i < number;i++)
{
for (j = 3;j >= 0;j--)
{
printf("%d.",IP8[i][j]);
}
printf("\n");
}
return 0;
} 展开
展开全部
写得太复裂昌杂桥握。用循环语句,一个数一个数地读入计算就可以了。
pow() 用 math.h 里的就可以了。
8 位2进制到10进制计算 用 v[j] = v[j]+ d * pow(2,7-k);
#include <stdio.h>
#include <math.h>敏源庆
main(){
int i,j,k,n;
char s[32];
static int v[4],d;
scanf("%d",&n);
for (i=0;i<n;i++){
for(j=0;j<4;j++){
v[j]=0;
for (k=0;k<8;k++){
scanf("%1d",&d);
v[j] = v[j]+ d * pow(2,7-k);
}
};
printf("%d.%d.%d.%d\n",v[0],v[1],v[2],v[3]);
};
return 0;
}
pow() 用 math.h 里的就可以了。
8 位2进制到10进制计算 用 v[j] = v[j]+ d * pow(2,7-k);
#include <stdio.h>
#include <math.h>敏源庆
main(){
int i,j,k,n;
char s[32];
static int v[4],d;
scanf("%d",&n);
for (i=0;i<n;i++){
for(j=0;j<4;j++){
v[j]=0;
for (k=0;k<8;k++){
scanf("%1d",&d);
v[j] = v[j]+ d * pow(2,7-k);
}
};
printf("%d.%d.%d.%d\n",v[0],v[1],v[2],v[3]);
};
return 0;
}
展开全部
#include <stdio.h>
int main() {
int i,j,n,IP[4];
char s[33];
scanf("%d",&n);
while(n--) {
fflush(stdin);
fgets(s,33,stdin);
for(i = 3; i >= 0; --i) {
IP[i] = 0;
for(j = 8 * (3 - i); j < 8 * (4 - i) && s[j]; ++j)
IP[i] 枣郑= 2 * IP[i] + s[j] - '0';
printf("%d%c",IP[i],((i > 0) ? '.' 行烂: 档岩漏'\n'));
}
}
return 0;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
显示结果错吗??还是优化问题?
追问
结果不对 我在想是不是我的逻辑有错 麻烦看下
追答
#include
int pow(int m,int n)
{
int i;
int p=1;
for (i = 0;i < n;i++)
{
p=p*m;
}
return p;
}
int main()
{
int i,j,k,number,m,IP8[9][4];
int k1,k2,k3;
scanf("%d",&number);
char IP2[9][32];
for (i = 0;i < number;i++)
{
scanf("%s",&IP2[i]);
}
for (i = 0;i < number;i++)
{
for (j = 0;j < 4;j++) //32位分4次处理
{
m=0;
k1=0+(8*j); //j从0~4. 所以k1~k2为0~7,8~15....你的例子是0~8,8~16....
k2=7+(8*j); //修改1
for (k = k1;k <= k2;k++) //修改2,k表示数组下标,范围从k1到k2
{
if (IP2[i][k]=='1')
{
k3=k-8*j;
m=m+pow(2,7-k3); //修改3,低位和高位你搞反了
}
}
IP8[i][j]=m;
}
}
for (i = 0;i < number;i++)
{
for (j=0;j <= 3;j++) //修改3,输出顺序你搞反了
{
printf("%d",IP8[i][j]);
if(j<3)
printf("."); //最后一个没有小数点
}
printf("\n");
}
return 0;
}
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询