国庆放假回来,继续做一下华为机考题,确实难道不大,还是考基础。废话不多说,还是继续刷题:
第一题是:质数因子。
功能:输入一个正整数,按照从小到大的顺序输出它的所有质数的因子(如180的质数因子为2 2 3 3 5 )
最后一个数后面也要有空格
详细描述:
函数接口说明:
public String getResult(long ulDataInput)
输入参数:
long ulDataInput:输入的正整数
返回值:
String
输入描述:
输入一个long型整数
输出描述:
按照从小到大的顺序输出它的所有质数的因子,以空格隔开。最后一个数后面也要有空格。
输入例子:
180
输出例子:
2 2 3 3 5
解题思路:
借助数学的整除法,利用小于或等于这个数的素数去整除这个数,如果可以整除,将该素数进行保存或直接输出,所以这个题目的核心在于判断一个数是否为素数。
比如:180,我们先用n(这里的n应该为2,3,4,5,6.。。。180或者是180,179,178,。。。5,4,3,2这种倒叙,这个取决于结果的输出顺序, 而且需要保证n是素数)去整除180,如果可以整除,然后不断地除下去。
素数判断,就是利用整除性质,特殊情况主要是1,2。
用C编写的代码如下:
#include <stdio.h> int main() { long input; while(scanf("%d",&input)!=EOF) { int i,k,j=0; int zhishu[1000]; for(i=2;i<=input;i++) { if(input%i==0&&IsZhishu(i)==1) { input=input/i; printf("%d ",i); i--; } else { continue; } } printf("\n"); } return 0; } //判断是否为素数 int IsZhishu(int y) { int j; if(y==1) return 0; //1为非素数 if(y==2) return 1; //2为素素 for(j=2;j<y;j++) { if(y%j==0) { return 0; //如果能够被小于它的数整除,就说明它是一个非素数 } } return 1; //输出默认为素数 }
运行结果:
关于素数的判断方法:
方法一:
#include<stdio.h> #include<math.h> main() { int i,n; printf("请输入一个数:"); scanf("%d",&n); for(i=2;i<n;i++) if(n%i==0) { printf("非素数!"); break; } else { printf("素数!"); } }
方法二:
#include<stdio.h> #include<math.h> main() { int i,n,m; printf("请输入一个整数:"); scanf("%d",&m); n=(int)sqrt(m); for(i=2;i<=n;i++) if(m%i==0) break; if(i>n) printf("素数!\n"); else printf("不是素数!"); }
很明显,方法2比方法1效率更高,因为它循坏的次数大大降低。