题目1491:求1和2的个数
来源:互联网 发布:键盘按键替换软件 编辑:程序博客网 时间:2024/06/17 14:47
题目描述:
给定正整数N,函数F(N)表示小于等于N的自然数中1和2的个数之和,例如:1,2,3,4,5,6,7,8,9,10序列中1和2的个数之和为3,因此F(10)=3。输入N,求F(N)的值,1=<N<=10^100(10的100次方)若F(N)很大,则求F(N)mod20123的值。
题意要求找出1-N之间的数中1和2出现的次数,只要找出1出现的次数,2同理可得。
参考《编程之美》上1的数目,该题需要找规律,又是规律题,清华的机试给跪了~~~
总结规律如下:N=abcde
找出百位上可能出现1的次数num:(假设以百位为基准,更高位数值为iHighNumber=a*10+b,地位数组为iLowNumber=d*10+e)
若c<1,则num取决于更高位数字,num=iHighNum*100;
若c==1,则num取决于更高位数字,也受到低位影响,num=iHighNum*100+iLowNumber+1;
若c>1,则num取决于更高为数字,num=(iHighNum+1)*100;
其它位上可能出现1的次数同理可依次求出。
程序代码如下:
#include <cstdio>#include <cstring>int mod(int x){return x%20123;}int Sumls(char *str,int version){int length=strlen(str),curPos=length-1,power=0,iFactor=1; int iCount=0; while(curPos>=0) {int iLowerNum=0,iCurNum=0,iHigherNum=0;for(int i=curPos+1;i<length;i++){iLowerNum=mod(mod(iLowerNum*10)+str[i]-'0');} iCurNum=str[curPos]-'0';for(int i=0;i<curPos;i++){iHigherNum=mod(mod(iHigherNum*10)+str[i]-'0');}if(iCurNum<version){iCount=mod(iCount+iHigherNum*iFactor);}else if(iCurNum==version){iCount=mod(iCount+iHigherNum*iFactor+iLowerNum+1);}else{iHigherNum++;iCount=mod(iCount+iHigherNum*iFactor);}--curPos;iFactor=mod(iFactor*10); } return iCount; }int main(){ char str[103];while(~scanf("%s",str)){int res1=Sumls(str,1);int res2=Sumls(str,2);int res=res1+res2;printf("%d\n",mod(res));} return 0;}
总结:注意找规律,盘活整个程序。
- 题目1491:求1和2的个数
- 题目1491:求1和2的个数
- 【九度】题目1491:求1和2的个数
- 题目1491:求1和2的个数
- 题目1491:求1和2的个数
- 题目1491:求1和2的个数
- 九度OJ 题目1491:求1和2的个数
- 九度OJ题目1491:求1和2的个数
- 九度 oj 题目1491:求1和2的个数
- 九度OJ 1491 求1和2的个数
- 求1和2的个数 九度1491
- 九度1491 求1和2的个数
- 清华 2012 求1和2的个数
- 求2个数的最大公约数和最小公倍数
- 九度OJ 1491 清华大学2012机试 《求1和2的个数》
- 18周OJ题目利用函数模板求4个数的和
- 求1的个数
- C100-25 题目:求1+2!+3!+...+20!的和
- get table names and table columns from db
- 石头剪子布的游戏
- Commando War UVa 11729(贪心)
- Oracle 自定义函数详解(转)
- C+libvirt获取KVM存储池信息
- 题目1491:求1和2的个数
- how to execute sql script in c#
- 将图像中的某种颜色设为透明
- Oracle的system被锁的解决办法
- C/C++程序员求职面试指导
- linux 用户组的权限分配
- C++第2周项目6——点结构体与枚举
- IOS截屏的几种方法
- 词法分析器