【数论】简单游戏(easygame)

这篇博客讲述了如何解决一个数论问题,即给定一个整数n,找出从1到n之间1出现的总次数。博主通过推导和寻找规律,提出了解决方案,并给出了当n=11时,1出现4次的例子。问题规模限制为n≤maxlongint,对于30%的数据,n≤1000。
摘要由CSDN通过智能技术生成

题目描述

一天,小R准备找小h去游泳,当他找到小h时,发现小h正在痛苦地写着一列数,1,2,3,…n,于是就问小h痛苦的原因,小h告诉他,现在他要算1…n这些数里面,1出现的次数是多少,如n=11的时候,有1,10,11共出现4次1,现在给出n,你能快速给出答案么?

输入

一行,一个整数n

输出

一个整数,表示1…n中1出现的次数。

输入样例

11

输出样例

4

说明

对于30%的数据:n<=1000;
对于100%的数据:n<=maxlongint;


推,找规律。


代码

#include<cstdio>
long long n,ans,k1,k2,k3;
int main(){
 scanf("%lld",&n);
 ans = (n + 9) / 10;
 for(long long i = 10; i <= n; i *= 10){  //枚举当前位
  k1 = n/(i*10);  //当前位置前面的数
  k2 = n/i % 10; //当前位
  k3 = n % i;  //后面的
  ans += k1 * i;  
  if(k2 > 1) ans += i;  
  if(k2 == 1) ans += k3+1; 
 }
 printf("%lld",ans);
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值