这题很有意思。
给定一个十进制正整数N,写下从1开始,到N的所有正数,计算出其中出现所有1的个数。
想象空间——————————————————————————————————
想象空间——————————————————————————————————
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1009
怎么划分问题很重要。从几个小数字的走向窥出全局,所以这是道想法题。不保证做法只有这一种,但是暴力是肯定会超时的。
#include <iostream> #include <cstring> #include <string> #include <cstdio> #include <cmath> #include <algorithm> #include <vector> #include <queue> #include <map> #include <stack> #define inf 0x3f3f3f3f #define ll long long #define mod 1000000007 using namespace std; int main(){ string x; cin>>x; ll n=0; for(int i=0;i<x.length();++i) n=n*10+x[i]-'0'; reverse(x.begin(),x.end()); ll s=0; for(int i=0;i<x.length();++i){ int p=x[i]-'0'; // cout<<pow(10,i+1)<<" "<<pow(10,i)<<" "<<pow(10,i)<<endl; // ll w=s; if(p<1) s+=n/(int)pow(10,i+1)*pow(10,i); else if(p==1){ s+=n/(int)pow(10,i+1)*pow(10,i)+(n%(int)pow(10,i)+1); // cout<<n/(int)pow(10,i+1)<<" "<<n%(int)pow(10,i)<<endl; } else if(p>1) s+=n/(int)pow(10,i+1)*pow(10,i)+pow(10,i); // cout<<s-w<<endl; } cout<<s<<endl; return 0; }