整数算法 与 位运算

 输入一个整数a,再输入两个整数p1,p2(p1,p2<32),输出该整数的二进制表示方法中从右端开始的p1到p2位.

#include <stdio.h>


void fun(long n,int p1,int p2);
int main()
{
    long n;//32位的整数是长整形
    int p1,p2;//p1,p2是位数
    printf("请输入三个数:\n");
    scanf("%ld",&n);
    scanf("%d%d",&p1,&p2);
    printf("%d到%d位的值是(p1,p2<32):\n",p1,p2);
    fun(n,p1,p2);//调用fun函数
    printf("\n");
        return 0;
}


void fun(long n,int p1,int p2)
{
    int i;
    long t;
    int temp = 0;//中间变量,如果p1>p2就交换值,保证p1是低位
    if( p1 > p2)
    {
        temp  = p1;
        p1 = p2;
        p2 = temp;
    }
    for(i = p1;i <= p2;i++)//输出p1到p2位
    {
        t = n & (1 << i-1);//通过1左移位数判断某位是否是0,第一位是左移0,所以是I-1
        if (t)//如果是非0 则表示当前数非0
        {
            printf("1");
        }
        else
        {
            printf("0");
        }
    }
}

将任一整数 转换为二进制形式 

#include<stdio.h>
int main()
{
    int x;
    printf("Input number:");
    scanf("%d", &x);
    printf("number of decimal form: %d\n", x);
    printf("it's binary form:");
    printb(x,sizeof(int)*8);
    putchar('\n');
}
printb(x, n)
    int x, n;
{
    if (n > 0)
    {
        putchar('0'+( (unsigned) (x& ( 1<<(n - 1) ) ) >>(n - 1)));
         printb (x, n - 1);
    }

}
putchar('0'+((unsigned)(x&(1<<(n-1)))>>(n-1)));
-------------------
1<<(n-1) //将1左移n-1位,得到一个右起第n位为1的数字,比如n=3的时候,得到 00000100
x&(1<<(n-1))  //x和一个右起第n位为1的数字进行按位或运算,等于把x的右起第三位之外的位全部清空。如果n=3,x=20=00010100,那么 x&(1<<(n-1)) = 00000100

个人感觉可以理解为遍历   将遍历出的0或1按顺寻与00000000相加 

/

  1. 统计1~n有多少个9
    #include <stdio.h>
     
    void fun(int n)
    {
    	int i;
    	int temp;
    	int count = 0;
    	int b;
     
    	for(i = 1;i <= n;i++)
    	{
    		temp = i;
    		while(temp != 0)
    		{
    			b=temp % 10;// 与十求余
    			temp=temp / 10;//除以十寻找下一位的9
    			if(b == 9)//与十求余得到9 就++
    			{
    				count++;
    			}
    		}
    	}
     
    	printf("The result is:%d\n",count);
    }
     
    int main()
    {
    	int n;
     
    	printf("Enter a number!\n");
    	scanf("%d",&n);
     
    	fun(n);
     
        return 0;
    }
    

     

有n个人围成一圈,顺序排号,从第一个开始报数(从1到3报数),凡报到3的人退出圈子,问最后最后留下的是原来第几号的那位

#include<stdio.h> 
main() 
{ 
int a[100]; 
int i,n,p=0,q; 
printf("input number:"); 
scanf("%d",&n); 
q=n; 
for(i=0;i<n;i++) a[i]=i+1; 
for(i=0;;i++) 
 { 
 if(i==n) i=0; //当i++一直到n时,肯定有一些没有被选到,比如我们输入8,第一轮是3,6被赋值0,当i=8时,继续下一轮//
 if(a[i]!=0) p++;//我们下面定义的是当循环到三时,就赋值0,所以这边等0的不考虑在内// 
 else continue; 
 if(p%3==0)//这个就是从0一直加,到三的倍数就赋值为0,从而就达到我们的目的//
  {a[i]=0;q--;} //上面q=n;表明q==n,只有一个为0就减一,为下面做铺垫//
 if(q==1) break; //当剩下最后一个就输出//
 } 
for(i=0;i<n;i++) 
if(a[i]!=0) 
printf("spare: %d\n\n",a[i]); 
}

 

  1. 一个数如果恰好等于它的因子之和,这个数被成为完数,例如:6=1+2+3.请编程找出1000以内的完数
    #include <stdio.h>
    int main()
    {
    int i;
    int j;
    int sum=0;
    int temp;
    for(i = 1;i <= 1000;i++)//遍历1-1000
    {
    temp = i;
    for(j = 1;j <= temp/2;j++)//从i/2处寻找因子  简化算法
    {
    if(temp%j == 0)// 如果求余为0  说明是因子
    {
    sum+=j;// 将求得的因子相加
    }
    }
    if(sum == i) //如果sum与i相等  说明是完数
    {
    printf("%d ",i);
    }
    sum = 0;
    
    
    }
    printf("\n");
    return 0;
    }
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值