1049 Counting Ones

news/2024/7/7 18:32:52

1. 这一题起初我用递归的方式,还写了一个数整数有多少个1的函数,OneNum[i] = OneNum[i-1]+countOne(i);毫不意外地出现了段错误,也就是递归调用的次数太多。

2. 看了参考书,得到了思路上的启发:

给定一个数12,我们可以数从1到12,在个位上和十位上1这个数字各自出现了多少次,然后将二者相加。个位上在1-10中1出现了一次,在11-12中1出现了1次,共2次;十位上在10-12中1出现了3次,3+2=5。

如果一个数字还看不出规律,再举一个数123。个位上在1-10中出现1次,11-20中出现1次,……,120-123中出现一次,一共是123/10+1 = 13次,十位上在1-100中出现10次,在101-123中出现10次,一共是(123/100+1)*10 = 20次,百位上在100-123中出现了123-100+1=24次。

依然看不出,再举一个数1234。个位上出现1234/10+1=124次,十位上出现(1234/100+1)*10=130次,百位上出现(1200/1000+1)*100=200次,千位上出现1234-1000+1=235次。

依稀有些眉目了,但是刚才举得例子都是从大到小,现在再举一例4111。个位上出现4111/10+1=412次,10位上出现4111/100*10+(1-0+1)=412次,百位上出现4111/1000*100+(4111%100+1)=412次,千位上出现1*1000次。

可以看出如果当前位上的数字大于1,该位置上1出现多少次仅仅取决于前面的数字,如果等于1还取决于后面的数字。现在再举1例看看小于1的情况。

4001

对于个位:4001/10+1

对于10位:4001/100

对于100位:4001/1000

对于1000位:1*1000

abcde

e所在位:if(e<1)abcd,if(e>=1)abcd+1

d所在位:if(d<1)abc*10,if(d==1)abc*10+e+1,if(d>1)(abc+1)*10

c所在位:if(c<1)ab*100,if(c==1)ab*100+de+1,if(c>1)(ab+1)*100

b所在位:if(b<1)a*1000,if(b==1)a*1000+cde+1,if(b>1)(a+1)*1000

a所在位:if(a==1)bcde+1,if(a>1)1*10000

对于最低位和最高位可以特判。

将读入的整数n转化为字符串str,L为字符串的长度

首先将字符串翻转,最低位对应下标0。

if(str[0]<1)one_count += n/pow(10,i+1);else one_count += n/pow(10,i+1)+1;

最高位对应下标L-1

if(str[L-1]==1)one_count += n%pow(10,L)+1;else one_count += 1*pow(10,L)

对于当中任意位i

if(str[i]<1)one_count += n/pow(10,i+1)*pow(10,i)

if(str[i]==1)one_count += n/pow(10,i+1)*pow(10,i)+n%pow(10,i)+1

if(str[i]>1)one_count += (n/pow(10,i+1)+1)*pow(10,i)

注意一些细节:

1. pow得到的是浮点数,如果在mod后面会报错,如果在除号后面会导致除法的结果是浮点数,因此要在前面加强制类型转换。

新习得的方法:

1.从特殊到一般找规律

2.如果出错,用自己的测试用例debug

AC代码

#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<bits/stdc++.h>
#include<stdlib.h>
#include<time.h>using namespace std;
typedef long long LL;const int maxn = 110;
const int MOD = 1000000007;
const int INF = 1000000000;//INF:下确界  
const LL SUP = (1LL<<63)-1;//SUP:上确界 
const double eps = 1e-5;int main(){int n;scanf("%d",&n);char temp[20],str[20];sprintf(temp,"%d",n);int L = strlen(temp);for(int i=0;i<L;i++){//将字符串反转 str[i] = temp[L-1-i];}int count_one = 0; //最低位 if(str[0]-'0'<1)count_one += n/10;else count_one += n/10+1;//最高位if(L-1>0){//防止只有1位数的特殊情况 if(str[L-1]-'0'==1)count_one += n%(int)pow(10,L-1)+1;else count_one += 1*(int)pow(10,L-1);}//中间位for(int i=1;i<L-1;i++){if(str[i]-'0'<1)count_one += n/(int)pow(10,i+1)*(int)pow(10,i);else if(str[i]-'0'==1)count_one += n/(int)pow(10,i+1)*(int)pow(10,i)+n%(int)pow(10,i)+1;else if(str[i]-'0'>1)count_one += (n/(int)pow(10,i+1)+1)*(int)pow(10,i);} printf("%d",count_one);return 0;
}


http://lihuaxi.xjx100.cn/news/241234.html

相关文章

模态框获取id一直不变,都是同一个id值

2019独角兽企业重金招聘Python工程师标准>>> $(.refund-btn).click(function(){//此处必须是$(this),否则$(.refund-btn)重新获取&#xff0c;导致值一直不变var id $(this).attr(data-id);//var id $(.refund-btn).attr(data-id);错误&#xff0c;这样会导致一直…

Java Json API:Gson使用简单入门

GSON是Google开发的Java API&#xff0c;用于转换Java对象和Json对象。本文讨论并提供了使用API的简单代码示例。更多关于GSON的API可以访问&#xff1a;http://sites.google.com/site/gson/. 本文是GSON系列文章的第一篇。本文是其他文章的基础&#xff0c;因此不需要任何GSON…

php tab标签,JavaScript代码分享:tab标签的切换

本文实例讲述了js实现点击切换TAB标签。分享给大家供大家参考。具体如下&#xff1a;这里演示的选项卡效果代码&#xff0c;无jq,纯JS来实现&#xff0c;灰色风格&#xff0c;没有怎么美化&#xff0c;或许看上去比较普通&#xff0c;不过兼容性和操作起来挺舒服的&#xff0c;…

1003 我要通过!

1. 总体思路是自己先写写&#xff0c;看看哪些字符串符合&#xff0c;找出规律&#xff0c;然后根据测试用例来矫正。 2. 用到了递推的方法&#xff0c;我使用countA[maxn]数组存放截至当前位置一共出现的A的个数。 3. 正确的字符串满足的条件是&#xff1a;P之前A的个数P和T…

java正则表达式学习

1.简单认识正则&#xff1a;       public class Test {public static void main(String[] args) {//简单认识正则p("abc".matches("..."));p("a8729a".replaceAll("\\d", "-"));}public static void p(Object o){Sys…

KDD 2017奖项全公布,华人成最大赢家

雷锋网按&#xff1a;本文由雷锋网作者奕欣、岑峰、张驰、三川联合编辑。 北京时间8月15日&#xff0c;在经过两天的Tutorial和Workshops后&#xff0c;KDD 2017于今天下午正式开幕。 开场&#xff0c;KDD 2017大会主席Stan Matwin向我们展示了一组数据&#xff1a;本次KDD共有…

php 5/0,PHP 5.5.0 released.该怎么解决

当前位置:我的异常网 PHP PHP 5.5.0 released.该怎么解决PHP 5.5.0 released.该怎么解决www.myexceptions.net 网友分享于&#xff1a;2013-08-02 浏览&#xff1a;12次PHP 5.5.0 released.The PHP development team is proud to announce the immediate availability of PH…

(C++)寻找1-100以内所有素数,复杂度为O(nsqrt(n))与O(nloglogn)的两种方法

注意&#xff1a;1既不是质数也不是合数&#xff0c;2是质数。 1. 复杂度为O(nsqrt(n)) 原理&#xff1a;先写一个判断整数是否为素数的函数&#xff0c;其复杂度为sqrt(n)&#xff0c;其原理是对于一个数n&#xff0c;如果它有除了1和自身之外的因子&#xff0c;那么这个因子…