poj2105---用指针对数组分块操作

 
   
#include <stdio.h>

#include <stdlib.h>

int count=1;

int pow1(int a,int b)

{

    int pro=1,i;

    if(b==0)

        return 1;

    for(i=0;i<b;i++)

    {

        pro*=a;

    }

    return pro;

}

void trans(int *p1)//每次传进一个地址,调用一次这个函数,就算出这一块的10进制值,并直接输出

{

    int sum=0,i;

    p1--;

    for(i=0;i<8;i++)//sum=0,在第一次就已经获取了最右位的值

    //注意i从0开始,不仅在次数上,与从右向左2的指数从0开始

    //总结:这种8位一块的不易去判断数组的访问会不会出错,就用简单的例子去找规律

    {

        sum += *p1 * pow1(2,i);

        p1--;

    }//当循环出去的时候,p1实际上指向了这一块的前一个元素

    printf("%d",sum);

    //不是所有数后面都加点

    if(count++ <4)

        printf(".");

}



int main()

{

    int arr[32],n,i;

    char arr1[33];

    scanf("%d",&n);

    while(n--)

    {

        count=1;

        scanf("%s",arr1);

        for(i=0;i<32;i++)//对于输入,不可能将大数直接存进一个数,即使刚好能存进,也不便访问,所以用字符串先存

        {                           //再转换为int数组里的每一个元素

            arr[i]=arr1[i]-'0';

        }

        for(i=1;i<=4;i++)

            trans(arr+i*8);//arr+i*8这个是表示数组元素地址的常用形式

        printf("\n");

    }

    return 0;

}

题意:一个32位的串被分成4部分,每部分8位,将这8位二进制转换为十进制,就要转换4次

arr+8*1指向第二块的首元素,如果是4块,最后一次指针应该指向没有的第五块首元素地址

 

你可能感兴趣的:(poj)