问题描述:一本书的页码从自然数1开始顺序编码直到自然数n。输的页码按照通常的习惯编排,每个页码都不含有多余的前导数字0.例如,第6页用数字6表示,而不是06或者006等。数字计数问题要求对给定书的总页码n,计算出书的全部页码中分别用到多少次数字0,1,2...8,9。
算法设计:给定表示书的总页码的十进制整数n(1<=n<=10^9),计算书的全部页码中分别用到多少次数字0,1,2...8,9。
数据输入:输入数据由文件名为input.txt的文本提供。每个文件只有1行,给出表示书的总页码的整数n。
结果输出:将计算结果输出到文件output.txt。输出文件总共10行,在第k行输出页码中用到数字k-1的次数,k=1,2,....,10。
输入文件示例
input.txt
11
输出文件示例
output.txt
1
4
1
1
1
1
1
1
1
1
我的思路特别简单,就是将页码数遍历一遍,每个页码计算其含有的数字,并将各个数值累加在一个全局数组中。
#include<iostream>
#include<string.h>
#include<unistd.h>
#include<fstream>
using namespace std;
#define INPUT_FILE "input.txt"
#define OUTPUT_FILE "output.txt"
int count[10] = {};
void input_book_num(char* file)
{
ofstream fp;
fp.open(file, ios::out);
if(!fp)
{
cerr<<"Open file failed."<<endl;
exit(1);
}
int a = 0;
cout<<"请输入书目页码:";
cin>>a;
fp<<a<<endl;
fp.close();
}
void output(char* file, int nu)//将计算好的数据放入output.txt文件
{
ofstream fp;
fp.open(file, ios::app);
if(!fp)
{
cerr<<"Open file"<<"\""<<file<<"\""<<"failed."<<endl;
exit(1);
}
fp<<nu<<endl;
fp.close();
}
void read(char* file, int *nu)//从input.txt中读取总页码
{
cout<<"书本页码读取中...."<<endl;
sleep(1);
ifstream fp;
fp.open(file, ios::in);
if(!fp)
{
cerr<<"Open file"<<"\""<<file<<"\""<<"failed."<<endl;
exit(1);
}
fp>>*nu;
fp.close();
}
void num_handling(int nu)
{
cout<<"结果计算中..."<<endl;
sleep(1);
int a = 0, c = 0;
while(nu)//对页码数进行遍历
{
a = nu;
while(a)
{
c = a%10;//得到个位数字
switch (c)
{
case 0:
++count[0];
break;
case 1:
++count[1];
break;
case 2:
++count[2];
break;
case 3:
++count[3];
break;
case 4:
++count[4];
break;
case 5:
++count[5];
break;
case 6:
++count[6];
break;
case 7:
++count[7];
break;
case 8:
++count[8];
break;
case 9:
++count[9];
break;
default:
break;
}
a = a/10;将页码数缩小十倍
}
--nu;
}
}
int main()
{
int nu = 0;
int *pnu = ν
input_book_num(INPUT_FILE);
read(INPUT_FILE, pnu);
cout<<"nu = "<<nu<<endl;
num_handling(nu);
cout<<"将结果写入"<<OUTPUT_FILE<<"文件中...."<<endl;
for(int i=0; i<10; ++i)
{
output(OUTPUT_FILE, count[i]);
}
return 0;
}
计算结果
output.txt
测试用例试试
output.txt
再试个大的
output.txt
1000试试
结果这么有规律,应该没问题。
vim文件清空命令
在第一行用dG然后wq回车退出即可。