关于如何对任意数字进行数字统计p1554,数字统计
查看原帖
关于如何对任意数字进行数字统计p1554,数字统计
747970
lirifu楼主2024/3/22 13:19
总体思路:

统计每一位上各数字出现的次数并用数组进行存储

难点:

由于最高位没有0,需要对0进行特殊处理

数字统计的一般规律:

对于xyz这个数字,有: 从0-9开始, 数字0(最小)在个位出现x10+y+1次(就算xyz==0也成立) 数字1在个位出现的次数要进行讨论, 如果z>=1,那么1在个位出现的次数就是x10+y+1次 如果z<1,那么这个结果就要少1次,也就是x*10+y次 剩下数字以此类推

十位上的数字 0的计算:由于0不出现在最高位,且y的值可能为0,所以需要进行讨论 当y>0时:0出现x*10次 当y==0时:0出现(x-1)10+z+1次 1的计算: 当y>1时:1出现(x+1)10次 当y==1时:1出现x10+z+1次 当y<1时:1出现x10次 剩下数字和位数以此类推

总结出以下代码:

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

using namespace std;
int contnumber(long long a,long long b){
    long long res=0;
    long long weight=1;
    long long last=0;
    while(1){
        long long k=b%10;
        b/=10;
        //if(b==0&&a==0)return res;
        if(k>a){
            if(a==0&&weight!=1)res+=weight*(b);
            else res+=weight*(b+1);
        }else if(k<a){
            res+=weight*(b);
        }else if(k==a){
            if(a==0){
                if(weight==1)res+=weight*(b)+1;
                else res+=weight*(b-1)+last+1;
            }
            else res+=weight*(b)+last+1;
            // if(a==1){
            //     printf("b=%d last+1=%d res=%d\n",b,last+1,res);
            // }
        }
        last+=k*weight;
        weight*=10;
        if(b==0)return res;
        
    }
}
void caculate(long long number,long long *cnt){
    for(int i=0;i<10;i++){
        cnt[i]=contnumber(i,number);
        //if(i==1)printf("i=1 %d\n",cnt[1]);
    }
}
int main(){
    long long a,b;
    cin>>a>>b;
    long long aa[10]={0};
    caculate(a-1,aa);
    long long bb[10]={0};
    caculate(b,bb);
    int res[10]={0};
    for(int i=0;i<10;i++){
        //printf("%d-%d=%d ",bb[i],aa[i],bb[i]-aa[i]);
        printf("%d ",bb[i]-aa[i]);
    }
    system("pause");
    return 0;
}
2024/3/22 13:19
加载中...