算法:1~N中求出1的个数,(如果11 那1的个数就是2)

EANFS 2007-07-19 03:15:08
算法:1~N中求出1的个数,(如果11 那1的个数就是2)
...全文
2480 74 打赏 收藏 转发到动态 举报
写回复
用AI写文章
74 条回复
切换为时间正序
请发表友善的回复…
发表回复
star106 2008-03-20
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <math.h>
int n=0;
int find(int a)
{
int i=0;
static int j=0;
int num=0,m;
i=a%10;
m=a/10;
if(i==1)
num=1+j*(int)pow(10,j-1)+n%(int)pow(10,j) ;
else if(i!=0)
num=i*(int)pow(10,j-1)*j+(int)pow(10,j);
j++;
if (m==0) return num;
return num+find(m);
}

void main()
{
printf("please enter the number:");
scanf("%d",&n);
printf("%d",find(n));
}
shan1119 2007-08-06
  • 打赏
  • 举报
回复
其实 andnnl() 这位兄弟说的挺详细的,估计是拆成好多小方法大家没注意到.道理是一样的,就是可读性差了点,呵呵.
shan1119 2007-08-06
  • 打赏
  • 举报
回复
是有规律的,可以总结出公式来.以1234举例说明.

1 2 3 4
| | | |_____4 * 0 * 10^(0-1) + 10^0 = 1
| | |_______3 * 1 * 10^(1-1) + 10^1 = 13
| |_________2 * 2 * 10^(2-1) + 10^2 = 140
|___________1 + 3 * 10^(3-1) + 234 = 535

1 + 13 + 140 + 535 = 689

主要是拆分出数字1的跟不是1的公式是不一样的. 这样的话就能看出点规律来了.就是下边这两个了.

if(x==1)
i += 1+j*Math.pow(10, j-1) + (j>0?y:0);
else if(x!=0)
i += x * j * Math.pow(10, j - 1) + Math.pow(10, j);
EANFS 2007-08-06
  • 打赏
  • 举报
回复
Sorry ,不好意思,弄错了
shan1119(大天使,卐~解!)
对的
EANFS 2007-08-06
  • 打赏
  • 举报
回复
TO:shan1119(大天使,卐~解!)
跑了一下程序,结果不太对
100的时候
你的程序是21
答案应该是20
lovelycatty 2007-08-03
  • 打赏
  • 举报
回复
Mark一下
EANFS 2007-08-03
  • 打赏
  • 举报
回复
能不能给出一个工式呢
EANFS 2007-08-03
  • 打赏
  • 举报
回复
TO:shan1119(大天使,卐~解!)
能不能说一下原理
miracle20003 2007-07-27
  • 打赏
  • 举报
回复
我也说一下。。。呵呵。。!!!
将你要写的数据源转换成字符串。。
用charAt();拿出来再用数据集(ArrayList)将每个存储来
再每个拿出来比较是不是1,
定义一个变量为零。
是就自增
不是就返回。。
再打印变量。。。。
嗯。我只会说不会作。。。呵呵。。不知对不对。。。。
大家学习学习。。。。
chenyifei211 2007-07-27
  • 打赏
  • 举报
回复
package test1;

public class Test4
{
public static void main ( String args[] )
{
int i=117141;
int count=0;
String ms=String.valueOf(i);
for(int j=0;j<ms.length();j++){
if(ms.charAt(j)=='1')
count+=1;
}
System.out.println(count);
}
}
ccterran 2007-07-27
  • 打赏
  • 举报
回复
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test {
public static void main (String[] args) {

System.out.println(get(11)); // => 4 (因为有 1,10,11)
System.out.println(get(110));// => 33
}

public static int get (int n) {
int sum = 0;
for (int i=1; i<=n; i++) {
sum += getN (i);
}
return sum;
}

private static int getN (int i) {
String s = String.valueOf(i);
Pattern p = Pattern.compile("1");
Matcher matcher = p.matcher(s);
int sum = 0;
while (matcher.find()) {
sum += 1;
}
return sum;
}
}
xuunming007 2007-07-27
  • 打赏
  • 举报
回复
菜鸟们长见识,哪天我也去买一本高效程序的奥秘
CExplorer 2007-07-27
  • 打赏
  • 举报
回复
向各求《高效程序的奥秘》这本书,中文版,英文版的已找到
  • 打赏
  • 举报
回复
回复人:CExplorer(C++探索者) ( 一级(初级)) 信誉:100 2007-7-27 10:40:23 得分:0

向各求《高效程序的奥秘》这本书,中文版,英文版的已找到

回复人:xuunming007() ( 一级(初级)) 信誉:100 2007-7-27 10:48:13 得分:0

菜鸟们长见识,哪天我也去买一本高效程序的奥秘

================================================
这本书中文版是 2003 年出版的,书店已经不大买得到了,原价28元,我只是翻过一下,这里面几乎全是位运算。java.lang.Math 类中有关位运算的方法基本上都是从这本书里摘下来的。位运算算法我认为挺搞脑子的,不大好理解。
zdjray 2007-07-25
  • 打赏
  • 举报
回复
用位运算效率高些
如果x是32位的话,
下面5步就可以了
1、x = x & 0x55555555 + (x>>1) & 0x55555555;
2、x = x & 0x33333333 + (x>>2) & 0x33333333;
3、x = x & 0x0f0f0f0f0f + (x>>4) & 0x0f0f0f0f0f;
4、x = x & 0x00ff00ff + (x>>8) & 0x00ff00ff;
5、x = x & 0x0000ffff + (x>>16) & 0x0000ffff;

x既是输入也是输出(个数就是x)
复杂度为O(logN),N为数字的位数
andnnl 2007-07-25
  • 打赏
  • 举报
回复
跟我的差不多
shan1119 2007-07-24
  • 打赏
  • 举报
回复
循环次数为数字的长度.
shan1119 2007-07-24
  • 打赏
  • 举报
回复
1-1234567890的1个数:1429355270
shan1119 2007-07-24
  • 打赏
  • 举报
回复

int i = 0;
int x=0;
int y=0;
for (int j = 0; N > 0; j++) {
x = N % 10;
if(x==1)
i += 1+j*Math.pow(10, j-1) + (j>0?y:0);
else if(x!=0)
i += x * j * Math.pow(10, j - 1) + Math.pow(10, j);

y += x*Math.pow(10, j);
N = N / 10;

}
System.out.println(i);
  • 打赏
  • 举报
回复
shan1119 可能是最优解了。
加载更多回复(54)

62,623

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧