1. 分解质因数
题目内容:
每个非素数(合数)都可以写成几个素数(也可称为质数)相乘的形式,这几个素数就都叫做这个合数的质因数。比如,6可以被分解为2x3,而24可以被分解为2x2x2x3。
现在,你的程序要读入一个[2,100000]范围内的整数,然后输出它的质因数分解式;当读到的就是素数时,输出它本身。
提示: 可以用一个函数来判断某数是否是素数。
输入格式:
一个整数,范围在[2,100000]内。
输出格式:
形如:
n=axbxcxd
或
n=n
所有的符号之间都没有空格,x是小写字母x。abcd这样的数字一定是从小到大排列的。
输入样例:
18
输出样例:
18=2x3x3
时间限制: 500ms 内存限制: 32000kb
#include <stdio.h>
void isPrime(int n);
int main()
{
int n;
scanf("%d",&n);
printf("n=");
isPrime(n);
return 0;
}
void isPrime(int n)
{
int i=0,t=0,m=0,cnt=1;
int isPrime=1;
for(i=2;i<=n;i++){
if((n%i)==0){
isPrime=0;
}
if(isPrime==1){
printf("%d\n",n);
break;
}
else{
do{
t=n/i;
if(cnt>1){
printf("x%d",i);}else{
printf("%d",i);
cnt++;
}
m=t%i;
n=n/i;
}while(m==0);
}
}
}
写了好久。。。我发现要有好的编程习惯,括号要对齐,不然看不懂。
还有就是要把握循环的条件。虽然我写了之后看了其他人代码,发现有些人没有用函数,但是当初我看到作业的时候,我就想练一练新学的。
这里引用Flickrs大神的代码,感觉好清晰,但是我能力有限看不太懂。
这里是链接
#include <stdio.h>
int isPrime(int a){
int isprime = 1;
for (int i = 2; i * i <= a; ++i)
{
if (a % i == 0)
{
isprime = 0;
break;
}
}
if (isprime)
{
return 1;
}
else
return 0;
}
void PrimeFact(int a){
if(isPrime(a) == 0)
{
for (int i = 2; i * i <= a; ++i)
{
if (isPrime(i))
{
if (a % i == 0)
{
a /= i;
printf("%dx", i);
break;
}
}
}
PrimeFact(a);
}
else if (isPrime(a) == 1)
{
printf("%d", a);
}
}
int main(){
int a;
scanf("%d", &a);
printf("%d=", a);
PrimeFact(a);
return 0;
}
这里再引用一个大神sinat_38163598的代码:
这里是链接
这个大神写的好简练,好佩服。
#include <stdio.h>
int main()
{
int n,i=2;
scanf("%d",&n);
printf("%d=", n);
while(1)
{
if(n%i==0)
{
printf("%d",i);
n/=i;
if(n == 1) break; //i=n时。
printf("x");
}
else
i++;
}
return 0;
}
太服了,写的太好了。
2. 完数
题目内容:
一个正整数的因子是所有可以整除它的正整数。而一个数如果恰好等于除它本身外的因子之和,这个数就称为完数。例如6=1+2+3(6的因子是1,2,3)。
现在,你要写一个程序,读入两个正整数n和m(1<=n< m<1000),输出[n,m]范围内所有的完数。
提示: 可以写一个函数来判断某个数是否是完数。
输入格式:
两个正整数,以空格分隔。
输出格式:
其间所有的完数,以空格分隔,最后一个数字后面没有空格。如果没有,则输出一行文字:
NIL
(输出NIL三个大写字母加回车)。
输入样例:
1 10
输出样例:
6
时间限制: 500ms 内存限制: 32000kb
我的代码:
#include <stdio.h>
int wanshu(int t);
int main(){
int n,m,t=n,cnt=0;
scanf("%d %d",&n,&m);
for(t=n;t<=m;t++){
if(wanshu(t)==1){
cnt++;
if(cnt>1){
printf(" ");
}
printf("%d",t);
}
}
if(cnt==0){
printf("NIF\n");
}
}
int wanshu(int t){
int i=1,a=t,sum=0,cnt=0;
while(i<t){
if(t%i==0){
sum+=i;
}
i++;
}
if(sum==a){
return 1;
}else{
return 0;
}
}
放上纯爱枫若情大神的代码:
链接在这里
//此程序是用来测试两个数中间范围的数,是否有完数(完数就是指,一个数等于除它本身之外所有能整除它的数之和),如果有的话,就输出这些完数,如果没有就输出(NIL)。
#include <stdio.h>
//测试是否为整数
int test_number(int number){
int i,sum=0;
for(i=1;i<number;i++){
if(number%i==0){
sum+=i;
}
}
if(sum==number){
return 1;
}else{
return 0;
}
}
int main(){
int m,n,i,count=0;
scanf("%d %d",&n,&m);
for(i=n;i<=m;i++){
if(test_number(i)==1){
if(count!=0){
printf(" ");
}
printf("%d",i);
count++;
}
}
if(count==0){
printf("NIL");
}
printf("\n");
return 0;
}
我觉得写的非常好,看了之后就会用return了。
还是放上sinat_38163598大神的代码:
这里是链接
#include<stdio.h>
int main()
{
int j,sum,n,m;
int count = 0;
scanf("%d %d",&n,&m);
for (; n <= m; n++){
sum = 0;
for (j = 1; j < n; j++){
if (n%j == 0)
sum += j;
}
if (sum == n){
count++;
if (count!= 1){
printf(" ");
printf("%d", sum);
}
}
}
if(count==0){
printf("NIL\n");
}
return 0;
}
他没有用函数,感觉思路好清晰啊。
发现了一个关键,能用for循环,尽量用,而不是用while和do-while,因为这样更清晰。
今天这两个代码我要吐血了,首先是因为看不清层次,其次是因为搞不定循环的条件,然后就是搞不清怎么利用return。尤其是不会用return的时候,每一次函数里的cnt,再次循环时又归零,就很崩溃。