算法实现题 (用c++文件输入输出)

算法实现题   统计数字问题

 

问题描述:

 

  一本书的页码从自然数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;

}

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值