输入一个正整数n,计算出[0,n]这些整数中的二进制数没有连续3个1的数字有多少

输入一个正整数n,计算出[0,n]这些整数中的二进制数没有连续3个1的数字有多少?

例子:输入数字9,则输出结果位9。因为[0-9]中,只有数字7有连续的三个‘1’出现,别的都没有,所以一共有9个数字满足要求。

分析:这个题目与求解一个正整数中‘1’的个数有点类似,就是进行一些循环处理。

代码如下:

 1 #include <iostream>
 2 using namespace std;
 3 int main()
 4 {
 5     int n,num_1=0,k=0;
 6     cin>>n;
 7     for(int i=1;i<=n;i++)//对[1-n]进行循环处理
 8     {
 9         int j=i;
10         while(j)
11         {
12             if(j&1)
13                 num_1++;//该位置为1,则计数加1
14             else
15                 num_1=0;//该位置出现0,则计数清零
16             j >>= 1;
17             if(num_1==3)//假如计数达到3,这break处理,减少运算量
18             {
19                 k++;  //满足连续三个1的条件数字总个数
20                 break;
21             }
22
23         }
24         num_1=0;
25     }
26     cout<<n-k+1;
27     return 0;
28 }

原文地址:https://www.cnblogs.com/1216-ZhouJ/p/9644032.html

时间: 2024-11-03 22:48:52

输入一个正整数n,计算出[0,n]这些整数中的二进制数没有连续3个1的数字有多少的相关文章

任意输入一个正整数,求出其各位数字之和

//任意输入一个正整数,求出其各位数字之和 #include <stdio.h>void main(){    int num,s=0;     printf("请任意输入一个正整数:\n");     scanf("%d",&num);     while(num!=0)     {         s=num%10+s;//没有赋值的操作,在编写程序时没有意识到这一点         num=num/10;     } printf(&quo

ACM:每行输入一个正整数n,找出与它对应的比它大的最小的且它们对应的二进制中1的个数一样多的正整数.

#include<stdio.h> //每行输入一个正整数i,找出与他对应的比它大的最小的正整数且他们的二进制中1的个数一样多. /* 样例输入: 样例输出: 1 2 2 4 3 5 4 8 78 83 0 */ //78的二进制位1001110,有4个1:83比78大且83的二进制位1001011也是4个1. int main() { int count1,count2;//count1统计原数据对应的二进制中1的个数,count2... int a[100];//存输入的数字 int i=

输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字的最小的一个

/** * @Version 1.0.0 * 输入一个正整数数组,把数组里所有数字拼接起来排成一个数, * 打印能拼接出的所有数字的最小的一个.例如输入{3,32,321,4},则打印最小的数字是 * 321323 * * 其实就是一次排序,只是比较大小的方式与数值比较有所不同 * 这里采用冒泡排序的方式 */public class Pro33 { @MyAnswer public static void f(int array[]){ for(int i=0;i<array.length-1

提示用户输入一个正整数n,计算1+2+3+…+n的和

/* */ #include <stdio.h> int main() { // 1.提示输入 printf("请输入一个正整数:\n"); // 2.接收输入 // 定义变量保存用户输入的整数 int n; scanf("%d", &n); if (n<=0) { printf("非法输入\n"); return 0; } // 3.计算 // (1 + n) * n / 2; // 定义变量保存和 int sum =

9.5位操作(三)——给定一个正整数,找出与其二进制表示中1的个数相同,且大小最接近的那两个数

/** * 功能:给定一个正整数,找出与其二进制表示中1的个数相同,且大小最接近的那两个数. * (一个略大一个略小.) */ 三种方法: 方法一:蛮力法 方法二:位操作法 <span style="white-space:pre"> </span>/** * 方法:位操作法 * 思路:获取后一个较大的数 * 1)计算c0和c1.c1是拖尾1的个数,c0是紧邻拖尾1的作坊一连串0的个数. * 2)将最右边.非拖尾0变为1,其位置为p=c1+c0. * 3)将位p

输入年份和天数计算出几月几号

//转换函数如下,其中通过指针同时向主函数传回月份和天数 void month_day(int year, int yearday, int *month, int *day){ //k月份,leap判断是否闰年(0非闰年1闰年) int k, leap; int tab[2][13] = { { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }, { 0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30

[华为机试]输入一个正整数,输出2000年1月1日经过该整数天后的日期.

//输入一个正整数,输出2000年1月1日经过该整数天后的日期.已测试,输入值可以为0~1095727 //如,100天后,日期为2000 4 10 #include<stdio.h> #define MAX_YEAR 5000//年数可以从2000一直到4999年. //函数功能:求解第year年共有多少天 int day_in_year(int year) { if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400

编程题:用函数实现,用户输入年月日,来计算出该日期为当年第几天?

#include<stdio.h> /*函数is_leap_year()的返回值是判断该年是否闰年*/ int is_leap_year(int year) { int leap; if(year%4==0&&year%100!=0||year%400==0) leap=1; else leap=0; return leap; } /*函数len_of_month()的返回值为某年year的某月month的天数*/ int len_of_month(int year,int m

提示用户输入一个正整数n,如果n=5,就输出下列图形,其他n值以此类推

/* ***** **** *** ** * */ #include <stdio.h> int main() { // 1.定义一个变量存储用户输入的值 int n = 0; // 一定要初始化 // 2.判断n值合不合理 while (n <= 0) { // 2.1 提示用户输入正整数 printf("请输入一个正整数:\n"); // 2.2 接收输入的数据 scanf("%d", &n); } // 3.输出图形 for (int