搜索
查看: 1994|回复: 13
打印 上一主题 下一主题

教你如何保存小黑框的运行结果

[复制链接]
跳转到指定楼层
楼主
发表于 2015-11-8 20:00:05 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
比如要输出2147483647之内的素数,认真看完啊哈C的小伙伴都可以写出代码,
但是小黑框关闭后CPU辛辛苦苦算出来的那些数字没有了,怎样才能把运算结果保存到txt文件中呢?
其实只要在你的代码中加一条语句就OK了。
请看代码:
[mw_shl_code=c,true]#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
int prime(int n)//用于判断质数
{
        int i,f=1;
    if(n==2)                        return 1;
        if(n%2==0||n==1)        return 0;
    else
    {
                for(i=3;i<=sqrt(n);i+=2)
        {
                        if(n%i==0)        {f=0;break;}
        }
        if(f==1) return 1;
        if(f==0) return 0;
    }
   
}
int main()
{
        freopen("prime.txt","w",stdout);//就是它啦
    time_t start,end,time;
    start=clock();
    int n=1,i;
    printf("      2\t");
    for(i=3;i<=2147483647;i+=2)
        if(prime(i))   
        {        
            printf("%7d\t",i);
            n++;
            if(n%5==0)    printf("\n");
        }
    end=clock();
    time=end-start;
    printf("time=%d\n",time);
    exit(0);
        system("pause");
        return 0;
}[/mw_shl_code]
在main函数最前面加上这句[mw_shl_code=c,true]freopen("prime.txt","w",stdout);[/mw_shl_code]
运行结果会保存在txt文件中
prime.txt是保存的文件名,w是以只写的方式打开prime.txt这个文件

likethis.PNG (24.84 KB, 下载次数: 32)

likethis.PNG
沙发
 楼主| 发表于 2015-11-8 20:00:58 | 只看该作者
占个楼层备用

点评

I know.  发表于 2017-12-16 12:57
板凳
发表于 2015-11-8 20:34:12 | 只看该作者
本帖最后由 4399APPLE 于 2015-11-8 20:39 编辑
  1. $gcc test.c -o test && test > filename.txt
复制代码
或者直接编辑→标记→复制
不怎么推荐重定义stdin,stdout,stderr,定义出去后很难再定义回来
或者可以FILE,然后fprintf

地板
发表于 2015-11-8 20:37:32 | 只看该作者
另外一件事就是,你的prime有点啰嗦了...
  1. int prime(int n)
  2. {
  3.     int i;

  4.     if(n == 2)
  5.         return 1;
  6.     if(!(n % 2) || n == 1)
  7.         return 0;

  8.     for(i = 3;i <= sqrt(n);i += 2)
  9.         if(!(n % i))
  10.             return 0;
  11.     return 1;
  12. }
复制代码
5#
发表于 2015-11-8 21:45:55 | 只看该作者
赞一个!!
6#
发表于 2015-11-8 22:34:58 | 只看该作者
如果要说prime函数嘛
  1. #include <math.h>

  2. int prime(int n)
  3. {
  4.         int upper, i;
  5.         if(n < 2)
  6.                 return 0;
  7.         if(n == 2)
  8.                 return 1;
  9.         if(n % 2 == 0)
  10.                 return 0;

  11.         upper = sqrt(n);
  12.         for(i=3; i<=upper; i+=2)
  13.                 if(n % i == 0)
  14.                         return 0;
  15.         return 1;
  16. }
复制代码


首先我是支持函数多出口的,否则用goto来写最自然
知道了传进来的i是int,那就应该验证i<2的所有情况
先依次处理i<2, i==2, i是偶数三种情况再开始试除
另外sqrt肯定是个比较慢的过程,这个值只更新一次,如果不确定编译器会不会替你优化,记得放在循环外面。有些人把for的条件写成i*i<=n,这是错误的,因为必须要计算很多次乘法

另外主函数里面exit(0)后面为什么还有system("pause")这种完全无用的语句

最后这样计算某个区间的函数效率太低,可以去题解区看看我写的函数表的算法
7#
 楼主| 发表于 2015-11-12 20:13:04 | 只看该作者
4399APPLE 发表于 2015-11-8 20:37
另外一件事就是,你的prime有点啰嗦了...

嗯,回头看
8#
 楼主| 发表于 2015-11-15 21:09:01 | 只看该作者
4399APPLE 发表于 2015-11-8 20:34
或者直接编辑→标记→复制
不怎么推荐重定义stdin,stdout,stderr,定义出去后很难再定义回来
或者可以F ...

为了方便和简单,所以用了一行语句重定义stdout
更复杂的处理要用FILE 和相关函数
9#
 楼主| 发表于 2015-11-15 21:11:13 | 只看该作者
4399APPLE 发表于 2015-11-8 20:37
另外一件事就是,你的prime有点啰嗦了...

仔细看了,简洁不少
10#
 楼主| 发表于 2015-11-15 21:30:18 | 只看该作者
rosynirvana 发表于 2015-11-8 22:34
如果要说prime函数嘛

system(“pause”);暂停用,因为啊哈C不会替我暂停
CodeBlock装了不会用
11#
发表于 2015-11-15 21:44:12 | 只看该作者
福华 发表于 2015-11-15 21:30
system(“pause”);暂停用,因为啊哈C不会替我暂停
CodeBlock装了不会用

不是,前面有了exit(0); 那句system("pause");不会运行的
12#
 楼主| 发表于 2015-11-15 21:50:04 | 只看该作者
测试了两种prime函数的效率
[mw_shl_code=c,true]#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
int prime1(int n)
{
        int upper,i;
        if(n<2)
                return 0;
        if(n==2)
                return 1;
        if(n%2==0)
                return 0;
        upper=sqrt(n);
        for(i=3;i<=upper;i+=2)
                if(n%i==0)
                        return 0;
        return 1;
}
int prime2(int n)
{
        int i,f=1;
    if(n==2)                        return 1;
        if(n%2==0||n==1)        return 0;
    else
    {
                for(i=3;i<=sqrt(n);i+=2)
        {
                        if(n%i==0)        {f=0;break;}
        }
        if(f==1) return 1;
        if(f==0) return 0;
    }   
}
int main()
{
        int i;
    time_t t1,t2;
    t1=clock();
    for(i=1;i<=100000;i++)
        if(prime1(i))   
            printf("%d\n",i);
    t1=clock()-t1;
    t2=clock();
    for(i=1;i<=100000;i++)
        if(prime2(i))   
            printf("%d\n",i);
    t2=clock()-t2;
    printf("t1=%dsm\nt2=%dsm",t1,t2);
        system("pause");
        return 0;
}[/mw_shl_code]
PS:本来把第一个prime函数命名为prime_plus,第二个命名为prime_old,结果编译失败,看截图,那个错误提示是什么意思

time.PNG (1.52 KB, 下载次数: 35)

time.PNG

prime.PNG (87.07 KB, 下载次数: 31)

prime.PNG
13#
发表于 2015-11-15 22:03:03 | 只看该作者
链接错误,肯定是写错了函数名之类的
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

广播台
特别关注
快速回复 返回顶部 返回列表