输入一个整数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~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]);
}
- 一个数如果恰好等于它的因子之和,这个数被成为”完数”,例如: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; }