中国大学慕课C语言第六讲作业

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,再次循环时又归零,就很崩溃。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值