输入一个正整数n,计算出1~n之间出现1的次数

//要求:输入一个正整数n,计算出1~n之间出现1的次数
#include <iostream>
#include <math.h>
using namespace std;

void solve();
int input();
int power(int count);
void main(){
	solve();
	system("pause");
}

void solve(){
	int n,count=0,i,sum=0;
	n=input();
	//count为一个计数的,来计算n是几位数,如1则为个位数,2则为百位数
	i=n;
	while(i){
		i=i/10;
		count++;
	}
	while(count--){
		i=(n/power(count))%10;//提取了与count对应的位
		cout<<i<<endl;
		if(i==1){
			if(0==count)//如果对应个位
				sum+=1;
			else
				sum+=n%power(count)+1;
		}
		else if(i>1){
			sum+=power(count);
		}
		sum+=n/power(count+1)*power(count);
	}
	cout<<"一个有"<<sum<<"个1"<<endl;
}

int input(){
	cout<<"请输入您想要输入的数字:"<<endl;
	int n;
	cin>>n;
	if(cin.fail()){
		cout<<"您输入有误!"<<endl;
		exit(-1);
	}
	return n;
}

int power(int count){
	int m=1;
	if(count<0){
		cout<<"count值有误!"<<endl;
		return -1;
	}
	else
		while(count--)
			m*=10;
	return m;
}


编程之美的题目用我的方式编写出来,很少看源程序,最多看看思路。复杂度为O(n).

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值