《找出1到正整数N中出现1的次数》

1到N中1的出现次数算法
本文介绍了一种高效算法,用于计算从1到任意正整数N中数字1出现的总次数。通过分离正整数的每一位,利用最高位、当前位置和最低位的数字,设计了一个通用公式来快速得出结果。
部署运行你感兴趣的模型镜像

 

                                                                                      《找出1到正整数N中出现1的次数》

编程思想:依次求出正整数每个位数上出现1的次数,累加即可得到最后想要的结果;而每一位上出现1的个数与和它相邻的其它位数上的数字有关系(以此位置上的数为对称轴,其左边的所有数字作为其最高位,其右边的数字作为其最低位;当然若此位置已处于最低位或最高位,那么它对应的最低位或最高位置0),与它们有一个可求出1的固定的关系式(一个数各个位置上的数分离后,它们都对应着各个位置的基准,例如个位上的数对应的基准为1,以此类推即可),即若此位置上的数字为0,则在此位置上出现1的个数为最高位乘以基准;若为1,则等于最高位乘以基准加最低位再加1;若为其他,则为最高位加1乘以基准即可。即后,各个位上出现1的个数累加即可。

具体设计:(1)以4个变量high,m,low,f分别作为分离后当前位数的最高,本身,最低位以及分离其的基准;以while语句判断能进行进程的条件,只有当此数不越级别,才能继续进行,即在其中设置了一个判断终止的条件;

(2)依次按照个位,十位.......等等的顺序把各个位置上的数字分离出来,并以其为对称轴找出其最高位以及最低位:low=n-(n/f)*f;m=(n/f)%10;high=n/(f*10);

(3)用switch语句根据此位置上的数与最低,最高位上的数的固定关系式,依次累加计算每位上出现1的次数:switch(m){ case 0:count+=high*f; break; case1: count+=high*f+low+1;break;default:count+=(high+1)*f; break; }

(4)依次按照各位的基准把各位相应的出现的1的次数累加起来直至遇到终止的条件即可得到最终想要的结果。

源代码:

 

//找出1到正整数N中出现1的次数
//June 2th,2015
#include<iostream>
using namespace std;
long int f( long int n)
{

    long int low=0,high=0,m=0,f=1,count=0;
    while(n/f!=0)
    {
        low=n-(n/f)*f;
        m=(n/f)%10;
        high=n/(f*10);
        switch(m)
        {
        case 0:
            count+=high*f;
            break;
        case 1:
            count+=high*f+low+1;
            break;
        default:
            count+=(high+1)*f;
            break;
        }
        f*=10;
    }
    return count;

}
void main()
{
    int a,i=0;
    cout<<"请输入一个正整数:"<<endl;
    cin>>a;
    cout<<"f"<<"("<<a<<")"<<"="<<f(a)<<endl;
     long int m;
    cout<<"在32位整数中能找到符合要求的f(n)=n的最大数是:"<<endl;
    for(m=2147483647;m>=1&&i<1;m--)
    {
        if(f(m)==m)
        {
            cout<<m<<endl;
            i++;
        }
    }
}

 

 

 

实验结果截图:

 

编程总结:(1)当老师给出问题的时候,只是单纯混沌的举了一些不相干的例子,并没有从其中总结出什么规律;

(2)听了同学们的各抒己见,大多数还是不能满足老师想要的结果,继续思索中.......

(3)课下在查阅了相关资料以及汲取了老师上课的提示后,明了了如何解决问题以及编写代码了;

总之,多交流,多思考,多汲取别人的优点,多开拓视野是解决问题的必经之路!

 

转载于:https://www.cnblogs.com/Twinklelittlestar/p/4547991.html

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

编程实现找出n个正整数中的最大的偶数,可以按照以下步骤进行操作: 1. 创建一个空列表来存放输入的正整数。 2. 使用循环结构,根据用户输入的n次数,循环接收用户的输入的正整数,并将其添加到列表中。 3. 创建一个变量max_even_num,用于存放最大的偶数,初始值设为0。 4. 使用循环遍历列表中的每个数字: - 首先判断当前数字是否为偶数,可以通过判断该数字除以2的余数是否为0来确定。如果是偶数执行以下操作: - 判断当前数字是否大于max_even_num,如果是,则将当前数字赋值给max_even_num。 - 如果当前数字不是偶数,继续遍历下一个数字。 5. 循环结束后,检查max_even_num的值是否仍然为初始值0,如果是,说明列表中没有偶数;如果不是,说明找到了最大的偶数。 6. 输出max_even_num作为结果。 下面是一个使用Python编写的示例代码: ```python n = int(input("请输入正整数的个数:")) numbers = [] for i in range(n): num = int(input("请输入第{}个正整数:".format(i + 1))) numbers.append(num) max_even_num = 0 for num in numbers: if num % 2 == 0: if num > max_even_num: max_even_num = num if max_even_num == 0: print("列表中没有偶数") else: print("最大的偶数是:", max_even_num) ``` 通过以上代码,我们就可以找出n个正整数中的最大的偶数了。需要注意的是,以上代码假设用户输入的是有效的正整数。如果需要增加错误处理和异常处理的功能,可以对代码进行进一步完善。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值