找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 24127|回复: 9

[其他] C运行速度快批处理好多啊!(计算1000以内质数)

[复制链接]
发表于 2019-12-13 15:05:05 | 显示全部楼层 |阅读模式
本帖最后由 Gin_Q 于 2019-12-14 11:43 编辑

先是批处理的:
  1. @echo off & setlocal enabledelayedexpansion
  2. set time_sta=%time%
  3. set /p count=1000
  4. for /l %%a in (2,1,%count%) do (if %%a GTR 2 (set /a temp=%%a-1)
  5.         set /a is_prime=1
  6.                 for /l %%b in (2,1,!temp!) do (
  7.                         set /a temp1=%%a%%%%b
  8.                         if !temp1! EQU 0 ( set /a is_prime = 0 ))
  9.                 if !is_prime! EQU 1 (echo %%a是一个质数!
  10.                 >>te1.txt echo %%a是一个质数!& set /a sum+=1
  11.                         ) else (echo %%a是一个合数!
  12.                 >>te1.txt echo %%a是一个合数!& set /a sum_1+=1))
  13. echo;质数有%sum%个
  14. >>te1.txt echo 质数有%sum%个
  15. echo;合数有%sum_1%个
  16. >>te1.txt echo 合数有%sum_1%个
  17. echo;开始时间为%time_sta%
  18. echo;结束时间为%time%
  19. pause & exit
复制代码
结果:
2是一个质数!
3是一个质数!
...
990是一个合数!
991是一个质数!
992是一个合数!
993是一个合数!
994是一个合数!
995是一个合数!
996是一个合数!
997是一个质数!
998是一个合数!
999是一个合数!
1000是一个合数!
质数有168个
合数有831个
开始时间为11:39:13.91
结束时间为11:39:29.11
请按任意键继续. . .

----------------------------------------------------------分割线---------------------------------------------------------
C:
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. int prime(int n)
  4. {
  5.         int is_prime = 1, i;
  6.         if (n < 0)
  7.         {
  8.                 return -1;
  9.         }
  10.         for (i=2; i<n; i++)
  11.         {
  12.                 if (n % i == 0)
  13.                 {
  14.                         is_prime = 0;
  15.                         break;
  16.                 }
  17.         }
  18.         return is_prime;       
  19. }

  20. int main()
  21. {
  22.         FILE *fp;
  23.         if ((fp = fopen("D:\\GIN\\temp\\te.txt", "w")) == NULL)
  24.         {
  25.                 printf("fail to open file!");
  26.                 exit(0);
  27.         }
  28.         int a = 1000, b, i, sum = 0, sum_1 = 0;
  29.         //printf("请输入一个整数:");
  30.         //scanf("%d", &a);
  31.         for (i=2; i<=a; i++)
  32.         {
  33.                 b = prime(i);
  34.                 if (b == 0)
  35.                 {
  36.                         sum++;
  37.                         printf("%d是一个合数!\n", i);
  38.                         fprintf(fp, "%d是一个合数!\n", i);
  39.                 }
  40.                 else
  41.                 {
  42.                         sum_1++;
  43.                         printf("%d是一个质数!\n", i);
  44.                         fprintf(fp, "%d是一个质数!\n", i);
  45.                 }
  46.         }
  47.         printf("质数有%d个\n", sum_1);
  48.         printf("合数有%d个\n", sum);
  49.         fprintf(fp,"质数有%d个\n质数有%d个\n", sum_1, sum);
  50.         fclose(fp);
  51.         return 0;
  52. }
复制代码
结果:
2是一个质数!
3是一个质数!
...
990是一个合数!
991是一个质数!
992是一个合数!
993是一个合数!
994是一个合数!
995是一个合数!
996是一个合数!
997是一个质数!
998是一个合数!
999是一个合数!
1000是一个合数!
质数有168个
合数有831个

--------------------------------
Process exited after 0.1504 seconds with return value 0
请按任意键继续. . .
 楼主| 发表于 2019-12-13 15:08:16 | 显示全部楼层
我是一个新手,好奇就自己写了一下作对比,代码肯定不是最优的(对于我已经是现在能力所及的了)
发表于 2019-12-13 19:13:21 | 显示全部楼层
我就简单的和你说吧,只要算法不垃圾,越低级语言越快。汇编比C语言更快,你自己想想“批处理”在哪一个级别。

评分

参与人数 1技术 +1 收起 理由
Gin_Q + 1 赞成!就是学的很费劲!

查看全部评分

发表于 2019-12-14 01:16:16 | 显示全部楼层
同样的逻辑同样的算法,当然是静态编译的比较快啦。

nim语言 兼具接近C语言的性能,又有python代码风格的简洁,少年来看看吗?
 楼主| 发表于 2019-12-14 11:38:17 | 显示全部楼层
回复 1# Gin_Q


    第一次我搞错,两个那个脚本运行时间是包含了我输入数字的时间,后面更新了
发表于 2019-12-14 11:46:32 | 显示全部楼层
回复 5# Gin_Q


    再改一下啊。偶试写了下:powershell  0.12秒左右。C# 0.002秒左右
 楼主| 发表于 2019-12-14 12:32:57 | 显示全部楼层
回复 6# xczxczxcz


    大佬,我能力有限呢!(我这个是打印的答案,还保存了一份一摸一样的日志)
发表于 2019-12-14 16:01:26 | 显示全部楼层
本帖最后由 terse 于 2019-12-14 17:07 编辑

P会溢出唉~
改里面循环3开始递增2
  1. @echo off & setlocal enabledelayedexpansion
  2. set time_sta=%time%
  3. set /a count=1000,sum=sum_1=0,f=1
  4. for /l %%a in (2,1,%count%) do (
  5.      if %%a gtr 2 (
  6.         set /at=2,p=%%a,f=p%%2
  7.         if !f! neq 0 (
  8.            for /l %%p in (1,1,8) do (
  9.                 set /a "t=(p/t+t)/2,n=t*t,r=t,y=p-n"
  10.                 if !n! gtr !p! set /a "t=(p/t+t)/2,n=t*t,r=t,y=p-n"
  11.            )
  12.            REM set /at+-1
  13.            for /l %%b in (3,2,!t!) do (
  14.                 set /a t1=%%a %% %%b
  15.                 if !t1! equ 0  set f=0
  16.            )
  17.          )
  18.      )
  19.         if !f! equ 0 (
  20.                  set /a sum_1+=1
  21.                  echo %%a是一个合数!
  22.         ) else (
  23.              set /asum+=1
  24.              echo %%a是一个质数!
  25.        )
  26. )

  27. echo;质数有%sum%个
  28. echo;合数有%sum_1%个
  29. echo;开始时间为%time_sta%
  30. echo;结束时间为%time%
  31. pause & exit
复制代码

评分

参与人数 1技术 +1 收起 理由
Gin_Q + 1 厉害

查看全部评分

 楼主| 发表于 2019-12-14 16:50:24 | 显示全部楼层
回复 4# codegay

现在还搞不了,大佬!
发表于 2019-12-14 16:59:08 | 显示全部楼层
回复 9# Gin_Q


    nim语言应该是比C容易学。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-19 13:32 , Processed in 0.020690 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表