只要转发20人,数码宝贝人物就可以,是骗人吧

21:47 提问
判断一个数是否是素数,下面的程序有什么问题,求赐教
int main() {
printf("Please input a number n:");
scanf("%d",&n);
for(int i=2;i&n;++i) {
if(n%i==0)
printf("%d 不是素数",n);
if(n%i!=0)
printf("%d 是素数",n);
按赞数排序
问题是你得理解什么是素数,一个数字不能被除了1和它本身以外任何数整除的数才算素数,而你的程序仅仅在循环判断了一个值而不能整除,就断定是素数,那么这个怎么能对呢。
for里面改为i++不然会少判断一种情况,只要第一个if判断条件一直不满足则才有可能成为素数也就是当判断到i=n-1的时候仍然不满足就是素数,所以我们只需要第二个if判断i是否等于n-1如果是就为素数然后break
int main(void)
int count, i, m, n,
int repeat,
int prime(int m);
scanf("%d", &repeat);
for(ri = 1; ri &= ri++){
scanf("%d%d", &m, &n);
sum=count=0;
for(i=m;i&=n;i++)
if(prime(i)==1)
count++;sum=sum+i;
printf("Count = %d, sum = %d\n", count, sum);
int prime(int m)
for(i=2;i&=m-1;i++)
if(m%i==0) return 0;
这是以前写的一个。希望对你有帮助
判断素数主要是从定义出发,定义:只能由1和它本身整除的是素数,你的代码
if(n%i!=0)
printf("%d 是素数",n);
是错误的,这是以一概全,
#include &stdio.h&
int main()
while(~scanf("%d", &n))
if(n &= 1) puts("NO");
int flag = 0;
for(int i = 2; i & i++)
if(n % i == 0)
if(flag) puts("NO");
else puts("YES");
这是我简单的代码,素数判断还有其他好多方法。
#include&stdio.h&
#include&stdlib.h&
int main() {
int n=0,i;
printf("Please input a number n:");
scanf("%d",&n);
for( i=2;i&n;++i) {
if(n%i==0)
printf("%d 不是素数\n",n);
if(i&=n) printf("%d 是素数\n",n);
if(n%i!=0)
printf("%d 是素数",n);
只要满足这个条件,for循环就会跳出,当然不行。
bool IsPrime(int n) {
if (n & 2)
for (i = 2; i &= n / 2.0; i++)
if (n%i == 0)
这个是判断素数的程序
建议看看这个
C++程序,算法结构一样的
#include &iostream&
#include &cmath&
int main()
for(int i=100;i&+200;++i)
while(x&=floor(sqrt(i))&&(i%x!=0))
if(x&floor(sqrt(i)))
cout && i && "\t";
----------------------同志你好,我是CSDN问答机器人小N,奉组织之命为你提供参考答案,编程尚未成功,同志仍需努力!
其他相似问题7436人阅读
整数分解(1)
汇编语言(5)
算法(14)
分解因数(3)
任何1个大于2的整数都可以分解成几个素数的乘积。将1个整数分解成几个素数的乘积是个热门话题。
经常有人问到。本文试图用C语言和32位X86汇编语言给出一个比较好的实现。希望对c语言学习者和
汇编语言学习者带来帮助。
问题的提出:将一个整数分解素因数
根据算术基本定理,任何大于2的正整数都可以表示为素数的乘积,如果不考虑这些素数出现的次序,其
表示方式为唯一的。本题目的要求是输入一个正整数,将这个正整数显示为几个素数乘积的形式,如
60=2*2*3*5
& 对于合数n,它总可表示为两个数的乘积,如n=a*b,令a&=b,容易证明a &= sqrt(n),这里sqrt(n)表示n的
平方根,下同。这说明了,用i =2 到 sqrt(n)之间的数逐一试除,如果所有的i都不是n的因数,则n一定
是一个素数。如果在试除过程中,某个i能够整数n,则将i存入因子表,n/i =& n,直到 i*i大于n为止。
& 在试除过程中,若p和q都是n的因子,p是素数,q大于p,q是p的倍数,如果p能够整除n,则n = n / p,
这样,最终n就不再是p的倍数,故n也不会是q的倍数,故在计算n = n / p这一过程,p一定是一个素数,
这种方法得到的所有因子都是素因子。
& 在所有的试除方法中,最少的试除步骤是用2到sqrt(n)之间的所有素数去试除。但这个算法需要预先算出
sqrt(n)之间的所有素数。这是最快的算法,但我们这里不打算搞得这么复杂,我们这里的算法是用2和所有2
以上的奇数去试出。因为如果一个数是4,6,8的倍数,那么他一定是2的倍数,当被2除后,就不需要试再试
除4,6,8了。
下面给出一个C语言的实现
#include &stdio.h&
#include &stdlib.h&
typedef unsigned long DWORD;
//函数decomp_integer对n分解素因数,分解后的素数存入facArr数组,并返回因子的个数
int decomp_integer( DWORD n, DWORD facArr[])
//n的可能的一个因子
//4以内的数,不需要分解
facArr[0]=n; return 1;
//下面的while循环为2试出n,直到2不是n的因子为止
while ( (n & 1)==0) // 这里判断偶数用 (n &1)==0,这比(n % 2)==0更快
facArr[count++]=2;
//用3到sqrt(n)之间的奇数试除
while (fac*fac&=n) // fac*fac &= n
while (n % fac==0)
facArr[count++]=
facArr[count++]=n;
int main(int argc, char* argv[])
DWORD n,facArray[32];
printf(&Please input unsigned integer:&);
scanf(&%u&,&n);
count=decomp_integer(n,facArray);
printf(&%u=%u&,n,facArray[0]);
for (i=1;i&i++)
printf(&*%d&,facArray[i]);
printf(&\n&);
汇编语言可能是最麻烦的语言,在实践中,除非必要,好少有人用汇编语言写程序。这主要是因为
& 1.同样的题目,用汇编语言编程需要的代码量较大,费时费力
& 2.汇编语言的可读性很差,日后维护的成本也大。
许多有经验的工程师对汇编语言写程序都很头疼,对许多初学这说,更是一件难以完成的任务。
初学者常犯的错误是,一上来就有汇编写程序,不管有没有理清头绪,这样造成的结果就是,程序改
了又改,但总是不对,好容易改对了,但程序的风格很差,代码冗长,逻辑混乱,可读性很差。其实,
用任何语言写成都需要设计,程序应该具有模块化,条理清晰,风格一致。汇编语言是最接近机器的
语言,编写汇编程序,非常有利用理解计算机的工作原理。
个人觉得,对于一个逻辑比较复杂的汇编程序的设计,不妨采用高级语言为原型,用高级语言编译运
行通过了,说明你也就对这个题目理解了,然后,看看你的程序,哪里可以简化,哪里可以重构使其
更优雅。最后可将你用高级语言写的程序翻译成汇编语言,这里的翻译不是简单的翻译,汇编语言有
汇编语言的特点,他具有更大的灵活性,开发者应该总是用最适当的方式来实现它。
下面是这个题目的汇编版本,使用masm32编写。关于输入输出部分,使用的几个Windows API函数,
这里说明如下:
& 程序使用ReadFile从控制台输入数据,使用WriteConsole输出运算结果到控制台。字符串到数的转化
子程序是自己写的。见myAtoi。而数到字符串的转化调用的则是Windows API函数wsprintf。此外,程
序还用到GetStdHandle和ExitProcess,感兴趣的同学,可以查MSDN来得到更多的信息。
在C语言版,外循环的判断语句&while (fac*fac&=n)&使用了乘法,而汇编语言班则使用了性能更好的lea
指令,见下
&& mov edx,s_fac
&& mov eax,fac
&& lea edx,[edx+eax*4+4] ; (fac+2)*(fac+2)=s_fac * 4*fac+4
&& mov s_fac,edx
&& add fac,2&&&&&&&&&& &; fac +=2
其基本原理为,若s_fac是fac的平方,则在求(fac+2)^2时,使用了数学公式(fac+2)^2= fac^2 + 4*fac +4,
这里的^表示乘方,程序中,fac和s_fac分别表示当前因子和当前因子的平方,然后当前因子加2,同时需要
更新s_fac,在上面的代码中,先计算(fac+2)^2,(fac+2)=fac^2 + 4*fac +4=s_fac+ 4*fac +4,然后计算fac+2.
lea指令支持*4,*8这样的形式,故这里使用lea指令而没有时候性能很慢的乘法指令。
& 下面给出汇编语言版的代码,可借助c版的程序来理解汇编版,同时请体会汇编语言和c语言在处理逻辑方面的
的不同,特别是分支和循环语句。
; 如何编译链接该程序
; 本程序需使用masm32来编译,若你的masm32安装在c盘,请设置如下环境变量
; set include=c:\masm32\include
; set lib=c:\masm32\lib
; set PATH=c:\masm32\%PATH%
; 若本程序名为decomp.asm,则运行如下命令编译和链接和运行
; ml /c /coff decomp.asm
; link /subsystem:console decomp.obj
; decomp.exe
.model flat, 32 bit memory model
option casemap : case sensitive
include windows.inc
include user32.inc
includelib user32.lib
include kernel32.inc
includelib kernel32.lib
32 dup(?)number的所有素因子
facCount dd
?number的所有素因子的个数
?被分解的数
?number的当前因子
?number的平方
?临时变量,仅在调用Windows API函数是用
?标准输入设备句柄
?标准输出设备句柄
32 dup(?)输入缓冲区
outBuffer db
128 dup(?) ;输出缓冲区
'%u',0
'Please input an unsigned integer:'
'%u=%u',0
'*%u',0
;use global varible, don't pass any in parameter in stack
dcomp proc far uses esi
esi,esi is copy of n
facTab[0],eax
xor ecx,ecx: copy of count
jmp loop_02_cmp
mov facTab[ecx*4], 2
shr esi,1esi is copy of n,n /=2
loop_02_cmp:
mov edx,esi
loop_02 n % 2==0
mov s_fac,
jmp loop03_outer_cmp
loop03_outer:
jmp loop03_inner_cmp
loop03_inner:
mov edx, fac
mov facTab[ecx*4],fac[count++]=fac
inc count++
xor edx,edx
mov eax,esi
mov esi,eax
loop03_inner_cmp:
xor edx,edx
mov eax,esi
jz loop03_inner
mov edx,s_fac
mov eax,fac
lea edx,[edx+eax*4+4] ; (fac+2)*(fac+2)=s_fac * 4*fac+4
mov s_fac,edx
loop03_outer_cmp:
mov eax,s_fac
cmp eax,esi
jbe loop03_outer
this_ n ==1
mov facTab[ecx*4],esi
mov eax,ecx
this_exit:
;返回素因子数
dcomp endp
; convert from a string to a integer
myAtoi proc far C uses ebx esi, var_String
esi,var_Sin parameter =& esi
loop_read_char:
cl,byte ptr [esi] ; get a char from in_buff
cl,'0'
input_if the char &'0' or &'9', then jump out loop
loop_read_char
input_exit:
myAtoi endp
; use global varible, don't pass parameter in stack
; number: in parameter
; facTab: in paramter
; facCount: factor count
; hInstance: input device handle
output_fac proc far C uses ebx edi
edi, outBuffer
eax,facTab[0]
invoke wsprintf, edi, addr szFmtOut2,number,eax
convert_loop:
eax,facTab[ebx*4]
invoke wsprintf,edi,addr szFmtOut4,eax
edi,edi the wr 下次输出时的地址送edi
ebx,facCount
convert_loop
eax, outBuffer
edi,计算输出的字符串的长度,存入edi
invoke WriteConsole,hOutput,addr outBuffer,edi,addr tLen,0在控制台输出
output_fac endp
main proc far
invoke GetStdHandle,STD_OUTPUT_HANDLE 获取控制台输出设备的句柄
hOutput,eax
invoke WriteConsole,hOutput,addr szFmtOut1,sizeof szFmtOut1,addr tLen,0
invoke GetStdHandle,STD_INPUT_HANDLE 获取控制台输入设备的句柄
hInput, eax
invoke ReadFile,hInput,addr inBuffer,sizeof inBuffer,ADDR tLen,NULL
eax, inBuffer
invoke myAtoi,转化字符串为一个数
number,将这个数存入number
invo调用因子分解子程序,,各个因子存入facTab
facCount,分解后的因子个数存入facCount
invoke output_调用output_fac打印number的分解式
invoke ExitProcess,退出进程
, 转载请注明出处。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:169580次
积分:2312
积分:2312
排名:第13272名
原创:45篇
评论:121条
(1)(2)(1)(2)(1)(1)(2)(4)(7)(9)(2)(1)(1)(1)(1)(1)(2)(1)(11)C语言 实现一个函数,判断一个数是不是素数
#define _CRT_SECURE_NO_WARNINGS 1
#include &stdio.h&
#include&stdlib.h&
int prime(num)
for (i = 2; i & num / 2; i++)
if (num%i == 0)
int main()
int ret = 0;
scanf(&%d&, &num);
ret = prime(num);
if (ret == 1)
printf(&%d是素数\n&, num);
printf(&%d不是素数\n&, num);
system(&pause&);
(window.slotbydup=window.slotbydup || []).push({
id: '2467140',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467141',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467142',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467143',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467148',
container: s,
size: '1000,90',
display: 'inlay-fix'}

我要回帖

更多关于 boss太撩人宝贝肆意爱 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信