【算法设计与分析】数字统计问题(C++实现)
·
前言
下面描述了关于统计数字问题的两种解法
提示:以下是本篇文章正文内容,下面案例可供参考
一、问题描述
输入:n
输出:10行(对应数字0~9出现的次数)
问题要求:对1~n的数字进行数字统计(例如:123中有1个1,1个2,1个3)
注解:6不做06或006考虑,其他数字表示同理
附加要求:支持文件读写
二、使用步骤
1.引入库
代码如下:
#include<iostream>
#include<fstream>
#include<cmath>
需要了解更多头文件相关知识可以去菜鸟教程学习:实测真的蛮好用的
C++新手常用头文件(部分)
名称 用途 #include<iostream> 标准输入输出 #include <algorithm> STL通用算法库 #include <cmath> 定义数学函数 #include <cstring> 字符串处理 #include <vector> 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<<ans[i]<<endl;
cout<<"end"<<endl;
}
没给大家配一个主函数,大家可以自己写个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"<<cnt << endl;
if (a == 0) break;
int num[10] = { 0 };
count(a, num);
num[0] = num[0] - zero_extra(a);
for (int i = 0; i < 10; i++)
outfile << num[i] << endl;
}
myfile.close();
outfile.close();
return 0;
}
总结
SEE YOU AGAIN
不一般方法的方法总结:补全0,再删去0(核心提示:观察000-999中十个数出现的次数!)
声明:
本文内容仅用于个人学习记录,不用于任何商业用途。部分代码、技术观点或示例可能来源于网络或其他公开资源,如有侵权,请联系我删除。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)