求1到N(正整数)之间1出现的个数

一、题目要求

给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数一下其中出现“1”的个数。
要求:
写一个函数 f(N) ,返回1 到 N 之间出现的“1”的个数。例如 f(12)  = 5。
在32位整数范围内,满足条件的“f(N) =N”的最大的N是多少。
要求将设计思想、代码实现、实现截图、个人总结以博文的形式发表。
(截止日期2015-4-30晚18:00)
二、设计思想
首先得列出当N为1~AB(2=<A=<9)以内时,各种情况十位与个位“1”的个数,可以肯定十位的“1”与个位数上的“1”有关,即十位上“1”为B-0+1,个位上“1”与十位上数有关,即个位上“1”为A-0+1,所以用一个count变量记住“1”的个数。
三、代码
#include<iostream.h>
int main()
{
	int count=0,i,N,temp;
	cout<<"请输入N的值:";
	cin>>N;
	for(i=1;i<=N;i++)
	{
		temp=i;//记录i的值
		while(temp!=0)
		{
			count+=(temp%10==1)?1:0;
			temp/=10;//直接用i的话,i最后变为0,++的话变为1,死循环了
		}
	}
	cout<<count<<endl;
	return 0;
}
四、截图
当N=101时,百位上“1”有2个,十位上“1”有10个,个位上“1”有11个,总共23个
五、总结
 这个题目与以前题目都有一个相似之处,就像以前求读者买一批书的最低价格题目,都得找出一些数范围的各种联系或者规律,
再设计算法就好解决了,总之找规律很重要特别是这种需要技巧的程序设计题,技巧很重要。但是切记不是任何题目都有技巧,
所以特定题目特定考虑,找到最优算法。
 
 
 

转载于:https://www.cnblogs.com/2015tan/p/4466838.html

在C语言中,要出1-n之间能被3整除且至少有一位数字是5的正整数个数,我们需要编写一个程序来进行计算。首先,我们要遍历这个范围内的所有整数,然后检查每个数是否同时满足能被3整除和至少有一位数字是5这两个条件。 下面是一个简单的算法思路: 1. 对于给定的n,设置一个计数器count为0。 2. 从1开始遍历到n。 3. 对于每个整数num,检查它是否能被3整除(num % 3 == 0)。 4. 如果能被3整除,进一步检查这个数是否包含数字5。可以通过将num转换为字符串或逐个检查每个数字位来实现。 5. 如果满足以上两个条件,计数器count加1。 6. 遍历完成后,count即为所个数。 这里提供一个可能的C语言代码实现: ```c #include <stdio.h> #include <stdbool.h> bool containsFive(int num) { while (num > 0) { if (num % 10 == 5) { return true; } num /= 10; } return false; } int countNumbers(int n) { int count = 0; for (int i = 1; i <= n; i++) { if (i % 3 == 0 && containsFive(i)) { count++; } } return count; } int main() { int n; printf("请输入n的值:"); scanf("%d", &n); printf("1到%d之间能被3整除且至少有一位是5的正整数个数为:%d\n", n, countNumbers(n)); return 0; } ``` 这段代码定义了两个函数:`containsFive`用于判断一个整数是否包含数字5,`countNumbers`用于计算满足条件的整数个数。`main`函数用于从用户获取n的值并输出结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值