【算法设计与分析】数字统计问题(C++实现)

本文采用的是代码先行的学习逻辑撰写的 文末会概述方法思想

文章目录

前言

一、问题描述

二、使用步骤

1.引入库

2.一般方法

3.不一般方法

总结



前言

下面描述了关于统计数字问题的两种解法


提示:以下是本篇文章正文内容,下面案例可供参考

一、问题描述

输入:n

输出:10行(对应数字0~9出现的次数)

问题要求:对1~n的数字进行数字统计(例如:123中有1个1,1个2,1个3)

注解:6不做06或006考虑,其他数字表示同理

附加要求:支持文件读写

二、使用步骤

1.引入库

代码如下:

#include
#include
#include
需要了解更多头文件相关知识可以去菜鸟教程学习:实测真的蛮好用的

C++新手常用头文件(部分)

名称 用途 #include 标准输入输出 #include STL通用算法库 #include 定义数学函数 #include 字符串处理 #include      STL 动态数组容器(向量) …… ……

2.一般方法

代码如下

void count(int n){//挨个儿数的方法
	int ans[10],i;
	for(i=0;i<10;i++)
		ans[i]=0;
	for(i=1;i<=n;i++)
	{
		int temp=i;
		while(temp)
		{
			ans[temp%10]++;
			temp/=10;
		}
	}
	for(i=0;i<10;i++)
		cout<

没给大家配一个主函数,大家可以自己写个main函数调用

3.不一般方法

小白可以根据注释功能,自行补全子函数!!!锻炼自己!!!

void count(int p, int num[]) 
{
    int n = ws(p);  //求位数
    int m = highest(p);  //求最高位数字
    int m1 = yushu(p);//求去除最高位的余数。
    int x = f(n - 1);       

    for (int i = 0; i < 10; i++)//首先求最高幂次级1-9出现的相同次数 例如:4231中的0000-3999            
        num[i] += x * m;

    for (int i = 0; i < m; i++)//然后求余下部分的0-m(不包含m)的出现次数
        num[i] += (int)pow(10.0, n - 1);

    num[m] += m1 + 1;//例:这个是4000-4231(余下部分)的最高位出现次数

    num[0] += (n - ws(m1) - 1) * (m1 + 1); //计算其中零出现的次数 

    if (m1 == 0)return;  //递归截至条件        
    else count(m1, num);  //计算下一部分 例:4231->231->31->1

}

也可以继续往下看,我写的一些小函数:

比较拙劣,没有完善各类数据的异常处理(如有修改意见,感激各位指教)

//计算位数
int ws(int n) 
{ 
   
    int i = 0;
    while (n > 0) 
    {
        n /= 10;
        i++;
    }
    return i;
}

//计算这个数最高位
int highest(int n) 
{ 
    return n / (int)pow(10.0, ws(n) - 1);
}

//余数
int yushu(int n) 
{ 
    return n % (int)pow(10.0, ws(n) - 1);
}

//计算0-9出现的相同次数
int f(int n) 
{ 
    return n * (int)pow(10.0, n - 1);
}

//计算多余0
int zero_extra(int n) 
{ 
    return (1 - (int)pow(10.0, ws(n))) / (1 - 10);
}

附上一段匹配不一般方法的输入输出

int main()
{
    int a[10] = { 0 };
    ifstream myfile("~\input.txt");//你电脑上的地址
    ofstream outfile("~\output.txt",ios::ate);//你电脑上的地址
    string temp;
    if (!myfile.is_open())
    {
        cout << "未成功打开文件" << endl;
    }
    int cnt = 0;
    while (getline(myfile, temp))
    {
        cnt++;
        int a =std::stoi(temp);
        outfile << "test"<

总结

SEE YOU AGAIN

不一般方法的方法总结:补全0,再删去0(核心提示:观察000-999中十个数出现的次数!)

你可能感兴趣的:(算法)