标题: [其他] C运行速度快批处理好多啊!(计算1000以内质数) [打印本页]
作者: Gin_Q 时间: 2019-12-13 15:05 标题: C运行速度快批处理好多啊!(计算1000以内质数)
本帖最后由 Gin_Q 于 2019-12-14 11:43 编辑
先是批处理的:- @echo off & setlocal enabledelayedexpansion
- set time_sta=%time%
- set /p count=1000
- for /l %%a in (2,1,%count%) do (if %%a GTR 2 (set /a temp=%%a-1)
- set /a is_prime=1
- for /l %%b in (2,1,!temp!) do (
- set /a temp1=%%a%%%%b
- if !temp1! EQU 0 ( set /a is_prime = 0 ))
- if !is_prime! EQU 1 (echo %%a是一个质数!
- >>te1.txt echo %%a是一个质数!& set /a sum+=1
- ) else (echo %%a是一个合数!
- >>te1.txt echo %%a是一个合数!& set /a sum_1+=1))
- echo;质数有%sum%个
- >>te1.txt echo 质数有%sum%个
- echo;合数有%sum_1%个
- >>te1.txt echo 合数有%sum_1%个
- echo;开始时间为%time_sta%
- echo;结束时间为%time%
- 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:- #include <stdio.h>
- #include <stdlib.h>
-
- int prime(int n)
- {
- int is_prime = 1, i;
- if (n < 0)
- {
- return -1;
- }
- for (i=2; i<n; i++)
- {
- if (n % i == 0)
- {
- is_prime = 0;
- break;
- }
- }
- return is_prime;
- }
-
- int main()
- {
- FILE *fp;
- if ((fp = fopen("D:\\GIN\\temp\\te.txt", "w")) == NULL)
- {
- printf("fail to open file!");
- exit(0);
- }
- int a = 1000, b, i, sum = 0, sum_1 = 0;
- //printf("请输入一个整数:");
- //scanf("%d", &a);
- for (i=2; i<=a; i++)
- {
- b = prime(i);
- if (b == 0)
- {
- sum++;
- printf("%d是一个合数!\n", i);
- fprintf(fp, "%d是一个合数!\n", i);
- }
- else
- {
- sum_1++;
- printf("%d是一个质数!\n", i);
- fprintf(fp, "%d是一个质数!\n", i);
- }
- }
- printf("质数有%d个\n", sum_1);
- printf("合数有%d个\n", sum);
- fprintf(fp,"质数有%d个\n质数有%d个\n", sum_1, sum);
- fclose(fp);
- return 0;
- }
复制代码
结果:
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
请按任意键继续. . .
作者: Gin_Q 时间: 2019-12-13 15:08
我是一个新手,好奇就自己写了一下作对比,代码肯定不是最优的(对于我已经是现在能力所及的了)
作者: ivor 时间: 2019-12-13 19:13
我就简单的和你说吧,只要算法不垃圾,越低级语言越快。汇编比C语言更快,你自己想想“批处理”在哪一个级别。
作者: codegay 时间: 2019-12-14 01:16
同样的逻辑同样的算法,当然是静态编译的比较快啦。
nim语言 兼具接近C语言的性能,又有python代码风格的简洁,少年来看看吗?
作者: Gin_Q 时间: 2019-12-14 11:38
回复 1# Gin_Q
第一次我搞错,两个那个脚本运行时间是包含了我输入数字的时间,后面更新了
作者: xczxczxcz 时间: 2019-12-14 11:46
回复 5# Gin_Q
再改一下啊。偶试写了下:powershell 0.12秒左右。C# 0.002秒左右
作者: Gin_Q 时间: 2019-12-14 12:32
回复 6# xczxczxcz
大佬,我能力有限呢!(我这个是打印的答案,还保存了一份一摸一样的日志)
作者: terse 时间: 2019-12-14 16:01
本帖最后由 terse 于 2019-12-14 17:07 编辑
P会溢出唉~
改里面循环3开始递增2- @echo off & setlocal enabledelayedexpansion
- set time_sta=%time%
- set /a count=1000,sum=sum_1=0,f=1
- for /l %%a in (2,1,%count%) do (
- if %%a gtr 2 (
- set /at=2,p=%%a,f=p%%2
- if !f! neq 0 (
- for /l %%p in (1,1,8) do (
- set /a "t=(p/t+t)/2,n=t*t,r=t,y=p-n"
- if !n! gtr !p! set /a "t=(p/t+t)/2,n=t*t,r=t,y=p-n"
- )
- REM set /at+-1
- for /l %%b in (3,2,!t!) do (
- set /a t1=%%a %% %%b
- if !t1! equ 0 set f=0
- )
- )
- )
- if !f! equ 0 (
- set /a sum_1+=1
- echo %%a是一个合数!
- ) else (
- set /asum+=1
- echo %%a是一个质数!
- )
- )
-
- echo;质数有%sum%个
- echo;合数有%sum_1%个
- echo;开始时间为%time_sta%
- echo;结束时间为%time%
- pause & exit
复制代码
作者: Gin_Q 时间: 2019-12-14 16:50
回复 4# codegay
现在还搞不了,大佬!
作者: codegay 时间: 2019-12-14 16:59
回复 9# Gin_Q
nim语言应该是比C容易学。
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |