算法实现题 统计数字问题
问题描述:
一本书的页码从自然数1 开始顺序编码直到自然数n。书的页码按照通常的习惯编排,每个页码都不含多余的前导数字0。例如,第6 页用数字6 表示,而不是06 或006 等。数字计数问题要求对给定书的总页码n,计算出书的全部页码中分别用到多少次数字0,1, 2,…,9。
编程任务:
给定表示书的总页码的10 进制整数n (1≤n≤109) 。编程计算书的全部页码中分别用到多少次数字0,1,2,…,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<cstdio>
#include<cmath>
#include <fstream>
using namespace std;
int c[10];
void solve(int n){
//数n的位数
int len=log10(n)+1;
//最高位的值
int p=n/((int)round(pow(10.0,len-1)));
for(int i=0;i<10;i++){
c[i]+=p*(len-1)*(int)round(pow(10.0,len-2));
}
for(int i=0;i<p;i++){
c[i]+=(int)round(pow(10.0,len-1));
}
int t=(int)round(pow(10.0,len-1));
t=n%t;
if(t==0){//如果t为0
c[p]++;//最高位加1
c[0]+=len-1;//0位加len-1
return ;
}
int lenT=log10(t)+1;
if(lenT!=len-1){//若像10010这种情况,中间2个0也要相应的处理
c[0]+=(len-lenT-1)*(t+1);
}
c[p]+=1+t;
return solve(t);
}
int main(){
int n;
ifstream in("E:\\input.txt");
ofstream out("E:\\output.txt");
if(!in.is_open()) //没有打开字符流对象就输出错误信息
cout << "Open file failure1" << endl;
if(!out.is_open())
cout << "Open file failure2" << endl;
while(!in.eof()) //没有到达输入文件的结尾
{
in >> n;
fill(c,c+10,0);
int len=log10(n)+1;
solve(n);
for(int i=0;i<len;i++){
c[0]-=(int)round(pow(10.0,i));
}
for(int i=0;i<10;i++){
out <<c[i] << endl;
}
}
in.close(); //关闭字符流对象
out.close();
return 0;
}
算法实现题 程序存储问题
问题描述:
设有n 个程序{1,2,…, n }要存放在长度为L 的磁带上。程序i 存放在磁带上的长度是li,1≤i≤n 。程序存储问题要求确定这n 个程序在磁带上的一个存储方案,使得能够在磁带上存储尽可能多的程序。
编程任务:
对于给定的n 个程序存放在磁带上的长度,编程计算磁带上最多可以存储的程序数。
数据输入:
由文件input.txt 给出输入数据。第一行是2 个正整数,分别表示文件个数n 和磁带的长度L。接下来的1 行中,有n 个正整数,表示程序存放在磁带上的长度。
结果输出:
将编程计算出的最多可以存储的程序数输出到文件output.txt 。
输入文件示例输出文件示例
input.txt output.txt
6 50 5
2 3 13 8 80 20
#include<iostream>
#include <fstream>
#include <algorithm>//要用sort函数
using namespace std;
int a[1000];
int most(int *a,int n,int s){
int x=0;//x是已经占用的磁带长度
for(int i=0;i<n;i++){//n为程序个数
x=x+a[i];
if(x>s){//如果x超过了s磁带长度
return i;//不用i-1,因为数组下标就是从0开始的
}
if(i==n-1)
return n;//如果所有加起来都还没达到磁带长度限制
}
}
int main(){
int n,s;
ifstream in("E:\\input.txt");
ofstream out("E:\\output.txt");
if(!in.is_open()) //没有打开字符流对象就输出错误信息
cout << "Open file failure1" << endl;
if(!out.is_open())
cout << "Open file failure2" << endl;
in >> n>>s; //程序个数和磁带长度
for(int i=0;i<n;i++){
in>>a[i];//程序长度
}
sort(a,a+n);//升序排序 第一个参数是数组的首地址,一般写上数组名就可以
//第二个参数,首地址加上数组的长度n(代表尾地址的下一地址)。
//最后一个参数是比较函数的名称(自定义函数cmp),
//这个比较函数可以不写,即第三个参数可以缺省,这样sort会默认按数组升序排序。
out <<most(a,n,s)<< endl;
in.close(); //关闭字符流对象
out.close();
return 0;
}
算法实现题 整数因子分解问题
问题描述:
大于1 的正整数n 可以分解为:n=x1*x2*…*xm。
例如,当n=12 时,共有8 种不同的分解式:
12=12;
12=6*2;
12=4*3;
12=3*4;
12=3*2*2;
12=2*6;
12=2*3*2;
12=2*2*3 。
编程任务:
对于给定的正整数n,编程计算n 共有多少种不同的分解式。
数据输入:
由文件input.txt 给出输入数据。第一行有1 个正整数n (1≤n≤2000000000)。
结果输出:
将计算出的不同的分解式数输出到文件output.txt 。
输入文件示例 输出文件示例
input.txt output.txt
12 8
#include <fstream>
#include <stdio.h>
#include <iostream>
#include <stdlib.h>
using namespace std;
int count;
void solve(int n)
{
int i;
if(n == 1)//当商为1时即为已经算出一次分解累计+1
count++;
for(i=2;i<=n;i++)//每个数进行遍历
{
if(n % i == 0)//mod为0 即为可分解的数
solve(n/i);//递归调用进行分解
}
}
int main()
{
int n;
ifstream in("E:\\input.txt");
ofstream out("E:\\output.txt");
if(!in.is_open()) //没有打开字符流对象就输出错误信息
cout << "Open file failure1" << endl;
if(!out.is_open())
cout << "Open file failure2" << endl;
while(!in.eof()) //没有到达输入文件的结尾
{
count = 0;
in >> n;
solve(n);
out<<count<<endl;
}
in.close(); //关闭字符流对象
out.close();
return 0;
}
C++中文件读写操作
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
//创建输入字符流和输出字符流对象
ifstream in("E:\\data_in.txt");
ofstream out("E:\\data_out.txt");
if(!in.is_open()) //没有打开字符流对象就输出错误信息
cout << "Open file failure1" << endl;
if(!out.is_open())
cout << "Open file failure2" << endl;
int u, v, w;
while(!in.eof()) //没有到达输入文件的结尾
{
in >> u >> v >> w;//从文件中读入
cout << u << " " << v << " " << w << endl;
out << u << "--" << v << " " << w << endl; //输出到文件中
}
in.close(); //关闭字符流对象
out.close();
return 0;
}