编程之美-2.4 1的个数

本文介绍两种高效算法来计算从1到n的所有整数中数字1出现的总次数。第一种方法通过逐位遍历每个整数来计数,复杂度为O(N*lgN)。第二种方法采用更优的数学方法,将问题转化为计算高位、当前位和低位贡献的1的个数,实现O(lgN)的时间复杂度。
#include "stdafx.h"
typedef int ULONGLONG;


/**
method1 不可取 O(N*lgN)
*/
ULONGLONG Count1InAInteger(ULONGLONG n)
{
ULONGLONG iNum=0;
while(n!=0)
{
iNum+=(n%10==1)?1:0;
n/=10;
}
return iNum;
}


ULONGLONG f (ULONGLONG n)
{
ULONGLONG iCount=0;
for(int i=1;i<=n;i++)
{
iCount+=Count1InAInteger(i);
}
return iCount;
}


/**
method2
*/


int Sum1s(int n)
{
    int iCount=0;
int iFactor=1;
int iLower=0;
int iCurr=0;
int iHigher=0;
while((n/iFactor)!=0)
{
iLower=n-(n/iFactor)*iFactor;
iCurr=(n/iFactor)%10;
iHigher=n/(iFactor*10);


switch(iCurr)
{
case 0:
iCount+=iHigher*iFactor;
break;
case 1:
iCount+=iHigher*iFactor+iLower+1;
break;
default:
iCount+=(iHigher+1)*iFactor;
break;


}
iFactor*=10;


}
return iCount;


}




int _tmain(int argc, _TCHAR* argv[])
{
int n;
scanf("%d",&n);
printf("%d",Sum1s(n));
return 0;
}
设计一种算法,针对 Excel 表格中 A1:CV100 单元格区域进行统计。 1、规则如下: 1.1 每个单元格内只能输入字符串(”1”) 或者空字符串( ”” ); 1.2 在第 1 行、第 100 行、第 1 列、第 100 列输入空字符串( ”” ); 1.3 两个相邻的单元格都为 ”1” 时,开始单元格连通,形成连通区域。连通区域中的所有单元格周围相邻的所有单元格都为空字符串( ”” )时,连通结束; 1.4 在第2 行到99 行,第2 列到99 列中,每个单元格的相邻单元格定义如下 1 8 邻域 1 4 邻域 1.5 连通区域中的所有单元格个数表示连通区域的大小; 1.6 相同大小的连通区域表示同一种类型,定义为 N 号类型,如下所示为 1 号类型、2 号类型、3 号类型; 1 1 1 1 上图中共有 41 号类型连通区域 1 1 1 1 1 1 1 1 上图中共有 42 号类型连通区域 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 上图中共有 4 个 3 号类型连通区域 2编程要求 2.1 在第 1 行、第 100 行、第 1 列、第 100 列输入空字符串( ”” ), 在第 2 行到 99 行,第 2 列到99 列中,随机生成“1”或“”填入。 按“连通区域”的长度类型,统计该类型的个数2.2 编写程序,计算 A1:CV100 区域中,分别统计 1 到 N 号连通区域的个数,N ≤3,计算条件为 4 邻域; 2.3 编写程序,计算 A1:CV100 区域中,分别统计 1 到 N 号连通区域的个数,N ≤8,计算条件为 4 邻域; 2.4 编写程序,计算 A1:CV100 区域中,分别统计 1 到 N 号连通区域的个数,N ≤8,计算条件为 8 邻域; 2.4 编写程序,计算 A1:CV100 区域中,分别统计 1 到 N 号连通区域的个数
最新发布
08-14
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值